1.Thread
Android中有三种开启Thread的方式
1.继承Thread
class MyTherad extends Thread{ @Override public void run() { super.run(); //耗时操作 try { sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } //子线程内一旦有耗时操作就,就不能在子线程内进行UI修改 String a="123"; Log.i("接收到的值",a); } } //开启线程 MyTherad myTherad=new MyTherad(); myTherad.start();
2.实现Runnable接口
class MyRunnable implements Runnable{ @Override public void run() { try { Thread.sleep(3000); Log.i("实现接口创建子线程","123"); } catch (InterruptedException e) { e.printStackTrace(); } } } MyRunnable myRunnable=new MyRunnable(); Thread thread=new Thread(myRunnable); thread.start();
3.Thread和Runnable综合使用(最常见的)
new Thread(new Runnable() { @Override public void run() { try { Thread.sleep(3000); Log.i("匿名","333"); } catch (InterruptedException e) { e.printStackTrace(); } } }).start();
2.Handler
1.特点
从服务器接收到用户的昵称,并将昵称设置在textview对应的text属性上
连接服务器的功能,是属于耗时任务,所以必须放在子线程
子线程中是没有办法修改页面,借助Handler给主线程传递消息
主线程接收到消息后,开始执行修改UI
2.代码实现
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main2); tv_age = findViewById(R.id.tv_age); new Thread(new Runnable() { @Override public void run() { try { //模拟在连接服务器的耗时 Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } Message message=new Message(); message.what=1; message.obj=ac; handler.sendMessage(message); } }).start(); } private Handler handler=new Handler(Looper.getMainLooper()){ @Override public void handleMessage(@NonNull Message msg) { super.handleMessage(msg); if (msg.what==1){ tv_age.setText(ac); } } };
3. 给Handler传值有两种方式
1.new Message这种方式
Message message=new Message();
message.what=1;
message.obj=ac;
handler.sendMessage(message);
2.通过handler.hasMessages()这种方式
3.通过学习了以上知识做了一个进度条案例
代码实现
public class MainActivity3 extends AppCompatActivity { private ProgressBar progressBar; private int aa=0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main3); progressBar = findViewById(R.id.progressBar); new Thread(new Runnable() { @Override public void run() { try { while (aa<100){ Thread.sleep(100); aa++; handler.hasMessages(1); } } catch (InterruptedException e) { e.printStackTrace(); } } }).start(); } private Handler handler=new Handler(Looper.getMainLooper()){ @Override public void handleMessage(@NonNull Message msg) { super.handleMessage(msg); if (msg.what==1){ progressBar.setProgress(aa); } } }; }
4.Seriver中使用Handler
1.特点
Seriver中不会自动开启线程,也不会自动停止线程
2. 代码实现
public class MyService extends Service { public MyService() { } @Override public void onCreate() { Log.i("onCreate","服务已创建"); super.onCreate(); } @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.i("onCreate","服务已开启"); new Thread(new Runnable() { @Override public void run() { long ac=System.currentTimeMillis()+20*1000; while (System.currentTimeMillis()<ac){ synchronized (this){ try { wait(ac-System.currentTimeMillis()); } catch (InterruptedException e) { e.printStackTrace(); } } } stopSelf(); } }).start(); return super.onStartCommand(intent, flags, startId); } @Override public void onDestroy() { Log.i("onCreate","服务已销毁"); super.onDestroy(); } @Override public IBinder onBind(Intent intent) { // TODO: Return the communication channel to the service. throw new UnsupportedOperationException("Not yet implemented"); } }
5.IntentService
1.如何创建IntentService
1.new 一个Java文件
2.继承IntentService
3.实现onHandleIntent方法和构造方法
4.创建一个无参的构造方法
5.注册
2.特点
IntentService 自动开启线程,并在执行完毕后,关闭线程
3.代码实现
public class MyIntentService extends IntentService { /** * @param name * @deprecated */ public MyIntentService(String name) { super(name); } public MyIntentService(){ super("MyIntentService"); } @Override protected void onHandleIntent(@Nullable Intent intent) { Log.i("IntentSerivce","IntentSerivce已启动"); long ac=System.currentTimeMillis()+20*1000; while (System.currentTimeMillis()<ac){ synchronized (this){ try { wait(ac-System.currentTimeMillis()); } catch (InterruptedException e) { e.printStackTrace(); } } } } @Override public void onDestroy() { Log.i("IntentSerivce","IntentSerivce已销毁"); super.onDestroy(); } }