Android在子线程更新UI方式总结

    xiaoxiao2021-03-25  64

    1.Handler方式

    —————-复写handler的handleMessage方式——————-

    //在UI线程中创建Handler对象 private Handler mHandler = new Handler(){ @Override public void handleMessage(Message msg) { //根据Message的内容做相应的更新(一般使用msg.what,也可进行数据传递) } } //在非UI线程中(子线程)使用Handler发送更新消息 int UPDADE_UI = 1; Messager msg = Message.obtain(); msg.what = UPDATE_UI; mHandler.sendMessage(msg);

    —————-handler.post方式——————-

    //在UI线程中创建Handler对象 private Handler handler = new Handler(); //在子线程中调用Handler对象更新 handler.post(new Runnable() { @Override public void run() { //在此处直接更新UI,例如mText.setText("更新"); } });

    2.AsyncTask

    new AsyncTask<Void, Void, Void>() { @Override protected void onPreExecute() { super.onPreExecute(); } @Override protected Void doInBackground(Void... params) { } //onPostExecute()方法内可直接更新UI @Override protected void onPostExecute(Void aVoid) { //在此处可直接执行更新UI的操作 } }.execute();

    3.view.post

    将一个Runnable添加到消息队列,Runnable将在UI线程运行。 This method can be invoked from outside of the UI thread only when this View is attached to a window.即必须保证该View被添加到窗口。

    setContentView(R.layout.activity_main); button = (Button) findViewById(R.id.btn_show); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { new Thread(new Runnable() { @Override public void run() { //此处处于子线程内 button.post(new Runnable() { @Override public void run() { button.setText("liuconen"); } }); } }).start(); } });

    4.Activity.runOnUiThread(Runnable)方式

    public final void runOnUiThread (Runnable action) 在UI线程中执行,如果当前线程是UI线程是UI线程,动作将被立即执行; 如果当前线程不是UI线程,动作将被发送到UI线程的消息队列(按照消息队列的顺序执行) 示例:

    button = (Button) findViewById(R.id.btn_show); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { new Thread(new Runnable() { @Override public void run() { runOnUiThread(new Runnable() { @Override public void run() { //此处直接更新UI button.setText("liuconen"); } }); } }).start(); } });
    转载请注明原文地址: https://ju.6miu.com/read-37808.html

    最新回复(0)