Android之子線程更新主線程

子線程更新主線程UI操作的幾種方法:

//定義handler
    static final int SUCCESS = 1;
    static final int FAIL = 0;
    Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            switch (msg.what) {
                case SUCCESS:
                    Toast.makeText(MyActivity.this, msg.getData().get("msg").toString(), Toast.LENGTH_SHORT).show();
                    break;
                case FAIL:
                    Toast.makeText(MyActivity.this, msg.getData().get("msg").toString(), Toast.LENGTH_SHORT).show();
                    break;
                default:
                    super.handleMessage(msg);
            }
        }
    };

    //方法一:通過handler.sendMessage,更新UI主線程
    private void makeToastByHandlerSendMessage(String msgStr) {
        Message msg = new Message();
        msg.what = 0;
        Bundle bundle = new Bundle();
        bundle.putString("msg", msgStr);
        msg.setData(bundle);
        handler.sendMessage(msg);
    }

    //方法二:通過handler.post,更新UI主線程
    private void makeToastByHandlerPost(final String msg) {
        handler.post(new Runnable() {
            @Override
            public void run() {
                Toast.makeText(MyActivity.this, msg, Toast.LENGTH_SHORT).show();
            }
        });
    }

    //方法三:通過handler.post,延遲seconds秒後更新UI主線程
    private void makeToastByHandlerPostDelay(final String msg, int seconds) {
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                Toast.makeText(MyActivity.this, msg, Toast.LENGTH_SHORT).show();
            }
        }, seconds * 1000);
    }

    //方法四:使用runOnUiThread,更新UI主線程
    private void makeToastByRunOnUiThread(final String msg) {
        MyActivity.this.runOnUiThread(new Runnable() {
            @Override
            public void run() {
                Toast.makeText(MyActivity.this, msg, Toast.LENGTH_SHORT).show();
            }
        });
    }

    //方法五:通過view.post,更新UI主線程
    private void makeToatByViewPost(View view, final String msg) {
        view.post(new Runnable() {
            @Override
            public void run() {
                Toast.makeText(MyActivity.this, msg, Toast.LENGTH_SHORT).show();
            }
        });
    }

    //方法六:通過AsyncTask,更新UI主線程
    private void makeToastByAysncTask(final String msg) {
        AsyncTask asyncTask = new AsyncTask() {
            @Override
            protected Object doInBackground(Object[] params) {
                return null;
            }

            @Override
            protected void onPostExecute(Object o) {
                super.onPostExecute(o);
                Toast.makeText(MyActivity.this, msg, Toast.LENGTH_SHORT).show();
            }

            @Override
            protected void onProgressUpdate(Object[] values) {
                super.onProgressUpdate(values);
            }
        };
        asyncTask.execute();
    }

使用方法: 

//1、Handler.SendMessage
makeToastByHandlerSendMessage(msg);
//2、Handler.Post
makeToastByHandlerPost(msg);
//3、Handler.PostDelay
makeToastByHandlerPostDelay(msg,1);
//4、context.RunOnUiThread
makeToastByRunOnUiThread(msg);
//5、View.Post
makeToatByViewPost(btnLogin,msg);
//6、AysncTask
makeToastByAysncTask(msg);

 其實通過查看源代碼,發現非handler的實現方法最終還是通過handler來實現的。

MyActivity.this.runOnUiThread(new Runnable() {

});
view.post(new Runnable());

// 以上兩個方法最終都調用handler的sendMessageDelayed方法
public final boolean sendMessageDelayed(Message msg, long delayMillis)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章