【主线程跟新UI】Android主线程,子线程切换,跟新UI的几种方式

一、activity.runOnUiThread(Runnable action)

假如该方法也在子线程中需要切换到主线程去

注意:context对象要是主线程中的MainActivity,这样强转才可以

public void updateUI(final Context context) {
        ((MainActivity) context).runOnUiThread(new Runnable() {
            @Override
            public void run() {
                //此时已在主线程中,可以更新UI了
            }
        });
    }

如果没有上下文(context),试试下面的方法:
1.用view.getContext()可以得到上下文。
2.跳过context直接用new Activity().runOnUiThread(Runnable action)来切换到主线程。

二、handler的post

首先在主线程中定义Handler,Handler mainHandler = new Handler();(必须要在主线程中定义才能操作UI,如果想在其他地方定义,声明时要这样写: Handler mainHandler = new Handler(Looper.getMainLooper()),来获取主线程的Looper和Queue
用handler.post(Runnable)把消息放在该Handler依附的MessageQueue

假设下面方法在子线程中

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

Handler还有下面的方法:
1.postAtTime(Runnable r, long uptimeMillis); //在某一时刻发送消息
2.postAtDelayed(Runnable r, long delayMillis); //延迟delayMillis毫秒再发送消息

三、handler的sendMessage

参见这里

四、view.post(Runnable action)

假如下面的方法在子线程中

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

view自带的方法,如果你的子线程里而已得到要跟新的view的话可以用此方法进行跟新另外
view.postDelayed(Runnable action,long delayMillis)用来延迟发送

五、使用AsyncTask

参见这里

你可能感兴趣的:(【线程进程】)