开发者社区> 问答> 正文

如果在子线程中完成了耗时任务,如何更新UI?

如果在子线程中完成了耗时任务,如何更新UI?

展开
收起
迪哒迪滴喵 2024-07-22 16:20:33 49 0
1 条回答
写回答
取消 提交回答
  • 在子线程中完成了耗时任务后,如果需要更新UI,由于Android的UI操作必须在主线程中进行,因此需要通过某种方式将UI更新操作发送到主线程执行。常用的方式有以下几种:
    1.使用Handler的post方法:

    private static final Handler UI_HANDLER = new Handler(Looper.getMainLooper()); 
    
    @WorkerThread 
    private void doTask() throws Throwable { 
    // 模拟耗时任务 
    Thread.sleep(3000); 
    UI_HANDLER.post(new Runnable() { 
    @Override 
    public void run() { 
    // 更新UI 
    refreshUI(); 
    } 
    }); 
    }
    

    2.使用Handler的sendMessage方法:

    private final Handler UI_HANDLER = new Handler(Looper.getMainLooper()) { 
    @Override 
    public void handleMessage(@NonNull Message msg) { 
    if (msg.what == MSG_REFRESH_UI) { 
    // 更新UI 
    refreshUI(); 
    } 
    } 
    }; 
    
    @WorkerThread 
    private void doTask() throws Throwable { 
    // 模拟耗时任务 
    Thread.sleep(3000); 
    UI_HANDLER.sendEmptyMessage(MSG_REFRESH_UI); 
    }
    

    3.使用Activity的runOnUiThread方法:

    public class MainActivity extends Activity { 
    // ... 
    
    @WorkerThread 
    private void doTask() throws Throwable { 
    // 模拟耗时任务 
    Thread.sleep(3000); 
    runOnUiThread(new Runnable() { 
    @Override 
    public void run() { 
    // 更新UI 
    refreshUI(); 
    } 
    }); 
    } 
    }
    

    4.通过View的post方法

    private View view; // 假设这个view已经被初始化并附加到了UI上 
    
    @WorkerThread 
    private void doTask() throws Throwable { 
    // 模拟耗时任务 
    Thread.sleep(3000); 
    
    // 使用view的post方法将UI更新操作发送到主线程 
    view.post(new Runnable() { 
    @Override 
    public void run() { 
    // 这个run方法将在主线程中执行 
    refreshUI(); // 调用你的UI更新方法 
    } 
    }); 
    } 
    
    // 假设你有一个UI更新方法 
    private void refreshUI() { 
    // 在这里更新你的UI,比如改变TextView的文本 
    }
    

    以上四种方式都可以实现在子线程中完成耗时任务后,将UI更新操作发送到主线程执行。

    2024-07-22 18:08:37
    赞同 3 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Fusion Design - 企业级UI解决方案揭秘 立即下载
多IO线程优化版 立即下载
使用TensorFlow搭建智能开发系统自动生成App UI 立即下载