消息异步处理

来源:互联网 发布:数据可视化 sql 编辑:程序博客网 时间:2024/05/23 20:09
一个最标准的异步消息处理线程的写法应该是这样:
class LooperThread extends Thread {  
      public Handler mHandler;  
  
      public void run() {  
          Looper.prepare();  
  
          mHandler = new Handler() {  
              public void handleMessage(Message msg) {  
                  // process incoming messages here  
              }  
          };  
  
          Looper.loop();  
      }  
  } 


 
几种可以在子线程中进行UI操作的方法:
1. Handler的post()方法
2. View的post()方法
3. Activity的runOnUiThread()方法


子线程中通过Handler的post()方法进行UI操作就可以这么写:
public class MainActivity extends Activity {  
  
    private Handler handler;  
  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  
        handler = new Handler();  
        new Thread(new Runnable() {  
            @Override  
            public void run() {  
                handler.post(new Runnable() {  
                    @Override  
                    public void run() {  
                        // 在这里进行UI操作  
                    }  
                });  
            }  
        }).start();  
    }  
}  
我们在Runnable对象的run()方法里更新UI,效果完全等同于在handleMessage()方法中更新UI。




然后再来看一下View中的post()方法,代码如下所示:
public boolean post(Runnable action) {  
    Handler handler;  
    if (mAttachInfo != null) {  
        handler = mAttachInfo.mHandler;  
    } else {  
        ViewRoot.getRunQueue().post(action);  
        return true;  
    }  
    return handler.post(action);  
}  
原来就是调用了Handler中的post()方法


最后再来看一下Activity中的runOnUiThread()方法,代码如下所示:


public final void runOnUiThread(Runnable action) {  
    if (Thread.currentThread() != mUiThread) {  
        mHandler.post(action);  
    } else {  
        action.run();  
    }  
}  
如果当前的线程不等于UI线程(主线程),就去调用Handler的post()方法,否则就直接调用Runnable对象的run()方法。
1 0
原创粉丝点击