【Android笔记】多线程与 UI 交互的方法

一共四种:

1.Activity.runOnUIThread(Runnable action)
2.View.post(Runnable action),View.postDelay(Runnable action)
3.Handler
4.AsyncTask

一、Activity.runOnUIThread(Runnable action)

new Thread(new Runnable() {
    @Override
    public void run() {
        // 子线程中处理一些事…………
        
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                // 这里的代码在主线程中执行
                
            }
        });
    }
}).start();


二、View.post(Runnable action),View.postDelay(Runnable action)

new Thread(new Runnable() {
    @Override
    public void run() {
        // 子线程中处理一些事…………
        
        textView.post(new Runnable() {
            @Override
            public void run() {
                // 这里的代码在主线程中执行
                
            }
        });
    }
}).start();


三、Handler

1.先在主线程中定义一个Handler:

private Handler handler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        switch (msg.what) {
        case TEST:
            // 处理消息,进行UI操作
            break;
        default:
            break;
        }
    }
};


2.在子线程中用Handler传输Message对象:

new Thread(new Runnable() {
    @Override
    public void run() {
        // 子线程中处理一些事……
        ……
        // 将结果发送到主线程
        Message msg = new Message();
        // 标记
        msg.what = TEST;
        // 可携带两个整型数据
        msg.arg1 = ...
        msg.arg2 = ...
        // 可携带Object对象
        msg.obj = ...
        handler.sendMessage(msg);
    }
}).start();

四、AsyncTask

1.继承AsyncTask抽象类:

/**
 * 三个泛型参数分别为传入的参数、进度单位、返回值类型
 * Void表示不需要传入参数
 */
public class MyTask extends AsyncTask<Void, Integer, String> {
    // 用到的对象
    private Context context;
    private ListView lvApp;

    public MyTask(Context context, ListView listView) {
        super();
        this.context = context;
        this.lvApp = listView;
    }

    /** 任务开始执行之前调用,用于初始化操作 **/
    @Override
    protected void onPreExecute() {
        
    }

    /** 所有代码都在子线程中运行,用于处理耗时任务,不能操作UI **/
    @Override
    protected String doInBackground(Void... params) {
        // ……
        return str;
    }
    
    /** 后台任务通过publishProgress()方法后,此方法很快被调用,可操作UI **/
    @Override
    protected void onProgressUpdate(Integer... values) {
        
    }
    
    /** 后台任务执行完毕并使用return返回时,此方法很快被调用,可操作UI **/
    @Override
    protected void onPostExecute(String result) {
        
    }   
}


2.在主线程中启动任务

new MyTask(arg1, arg2).execute();

每个实例只能执行一次,否则会抛异常。


版权声明:本文为博主原创文章,未经博主允许不得转载。

posted @ 2015-09-16 20:32  包清骏  阅读(273)  评论(0编辑  收藏  举报