Android 的异步操作中访问 UI 界面


由于 UI 线程(主线程)不能长时间等待,所有 Android 异步操作使用率非常高。异步操作就是重新开一个线程来处理事件,这写线程都是非 UI 线程,不能直接对 UI 进行操作(比如给 TextView 填写内容)。以下介绍 4 种异步访问 UI 的方法:

一、Handler 方法

1、接收消息

定义一个 Handler 对象处理所有线程消息。

private static final int MSG_SUCCESS = 0;
private static final int MSG_FAIL = -1;

private Handler mHandler = new Handler() {
    public void handleMessage(Message msg) {
        switch (msg.what) {
        case MSG_SUCCESS: {            
            break;
        }
        case MSG_FAIL: {
            break;
        }
        default:
            break;
        }
    };
};

2、点击事件

多个线程使用同一个 Handler 对象发送消息。

public void pay(View v) {
    Runnable runnable = new Runnable() {
        @Override
        public void run() {            

            Message msg = new Message();
            msg.what = MSG_FAIL;
            mHandler.sendMessage(msg);
        }
    };

    Thread thread = new Thread(runnable);
    thread.start();
}

public void check(View v) {
    Runnable checkRunnable = new Runnable() {
        @Override
        public void run() {            

            Message msg = new Message();
            msg.what = MSG_SUCCESS;
            mHandler.sendMessage(msg);
        }
    };

    Thread thread = new Thread(checkRunnable);
    thread.start();
}

二、AsyncTask 方法

// UI线程中执行
new DownloadImageTask().execute( "www.91dota.com" );

private class DownloadImageTask extends AsyncTask {
    protected String doInBackground( String... url ) {
        return loadDataFormNetwork( url[0] );//后台耗时操作
    }

    protected void onPostExecute( String result ) {
        myText.setText( result ); //得到来自网络的信息刷新页面 
    }
}

三、View.post(Runnable ) 方法

public void onClick(View v) {
   new Thread(new Runnable() {
        public void run() {
            // 耗时操作
            ​​​​​​loadNetWork();
            ​myText. (new Runnable() {
                myText.setText(来自网络的信息);
            });
        }
    }).start();
}

四、Activity.runOnUiThread(Runnable ) 方法

public void onClick(View v) {
    new Thread(new Runnable() {
        public void run() {
            // 耗时操作
            ​​​​​​loadNetWork();
            ​Activity.runOnUiThread. (new Runnable() {
                myText.setText(来自网络的信息);
            });
        }
    }).start();
}


发表评论