一. 创建子线程

   //通过继承thread    public class JNThread1 extends Thread {        public JNThread1(String name){            super(name);        }        @Override        public void run() {            Message msg = new Message();            msg.obj = "I am a message!";            mHandler.sendMessage(msg);        }    }    //通过实现Runnable接口来创建子线程    public class JNThread2 implements Runnable{        public void run() {        }    }
     JNThread1 thread = new JNThread1("jiang");        thread.start();

二. 子线程回调主线程的方式

1.view.post(Runnable action)

这是我认为最简单的方法了,比如你在子线程获得了多个数据,需要更新textview显示这些数据,可以这样做

textView.post(new Runnable() {     @Override public void run() {         textView.setText("更新啦!");         //还可以更新其他的控件     }});

这是view自带的方法,比较简单,如果你的子线程里可以得到要更新的view的话,可以用此方法进行更新。

view还有一个方法view.postDelayed(Runnable action, long delayMillis)用来延迟发送。

2,activity.runOnUiThread(Runnable action)

这是我认为第二简单的方法了,一般我的上下文(context)是大部分类都会传到的,而这个 context 其实就是我的 MainActivity,我会直接强制转换成 Activity 然后用activity.runOnUiThread(Runnable action)方法进行更新UI

 /** * 假设该更新方法在子线程中运行 * @param context 上下文 * / public void update(final Context context) { ((MainActivity) context).runOnUiThread(new Runnable() {             @Override public void run() {              //已在主线程中,可以更新UI } }

如果没有上下文(context)怎么办?

用view.getContext()可以得到上下文(不过你为什么不直接用方法一呢?)
跳过context直接用new Activity().runOnUiThread(Runnable action)来切换到主线程。

重点内容

3,Handler

Handler 是最常用也是比上面稍微复杂一点的方法。

首先在主线程中定义Handler,Handler mainHandler = new Handler();(必须要在主线程中定义才能操作主线程,如果想在其他地方定义声明时要这样写Handler mainHandler = new Handler(Looper.getMainLooper()),来获取主线程的 Looper 和 Queue )
获取到 Handler 后就很简单了,用handler.post(Runnable r)方法把消息处理放在该 handler 依附的消息队列中(也就是主线程消息队列),这也是为什么我们第一步一定要获取主线程的 handler,如果在子线程中直接声明 handler,调用handler.post(Runnable r)其实还是在子线程中调用

/

/假设已在子线程 Handler mainHandler = new Handler(Looper.getMainLooper()); mainHandler.post(new Runnable() {     @Override public void run() {     //已在主线程中,可以更新UI     } });

其实一般 Handler 是和 Message 一起使用的。

 //假设在主线程中 Handler myHandler = new Handler() {      @Override public void handleMessage(Message msg) {       switch(msg.what) {       case 0: //xxx操作       case 1: //yyy操作       break;       default:       break;     }  }

之后可以把 mainHandler 当做参数传递在各个类之间,当需要更新UI时,可以调用sendMessage一系列方法来执行handleMessage里的操作。

//假设现在在子线程了 //获取消息 Message msg = myHandler.obtainMessage(); msg.what = 0; //消息标识 //msg.obj 用来提供额外对象参数 //发送消息 myHandler.sendMessage(msg);

如上代码,只是发送了个消息标识,并没有传其他参数(可以用msg.arg1
和 msg.arg2
用来提供额外int型参数,用msg.obj
用来提供额外对象参数),可以用简化方法sendEmptyMessage(int what)
来减少不必要的代码

myHandler.sendEmptyMessage(0); //其实内部实现还是和上面一样sendEmptyMessageAtTime(int what, long uptimeMillis); //定时发送消息sendEmptyMessageDelayed(int what, long delayMillis); //延时发送空消息sendMessageAtFrontOfQueue(Message msg); //最先处理消息(慎用)sendMessageAtTime(Message msg, long uptimeMillis); //定时发送消息sendMessageDelayed(Message msg, long delayMillis); //延时发送消息

更多相关文章

  1. GPS开发常用方法和Criteria确定android location providerGPS
  2. android 照个图 要开线程 不然永远拍的图都是那么的小
  3. 通过ddmlib杀死某个android进程的方法
  4. Android中为什么在子线程不能更新UI
  5. Android之 inflate() 方法总结
  6. Android读取服务器图片的三种方法
  7. android播放本地工程里的音乐和视频的方法
  8. ActionBar的一些使用方法
  9. H5调用原生APP的js方法

随机推荐

  1. Android招财进宝手势密码的实现
  2. Android通信方式(三)------WebService补
  3. Android内存泄漏优化总结
  4. Google 将原生 Android(安卓)的键盘放上
  5. Android(安卓)bluetooth development
  6. 【Android】内嵌数据库IDE(可视化操作类)
  7. mac10.8下搭建Android的Eclipse开发环境
  8. android中对线程池的理解与使用
  9. [Android问答] 如何实现“退出应用”功能
  10. android监控上传小demo之第二步 设定定期