【问题标题】:HandlerThread didn't run in background?HandlerThread 没有在后台运行?
【发布时间】:2016-10-21 20:17:17
【问题描述】:

我正在尝试学习如何使用 HandlerThread 在后台运行。我在片段中有一个按钮,单击该按钮时,我想从数据库中获取条目数。但是当我实际运行它时,logcat 说应用程序可能在主线程上做了太多的工作,我不知道我做错了什么。

这是我在片段中排列代码的方式:

private Handler handler=new Handler();
private MyWorkerThread myWorkerThread;

private Runnable myRunnable=new Runnable() {
    @Override
    public void run() {
        handler.post(new Runnable() {
            @Override
            public void run() {
                List<Item> list=db.getAllItems();
                Log.d(TAG,"Size: "+list.size());
            }
        });
    }
};

private class MyWorkerThread extends HandlerThread{
    private Handler myHandler;

    private MyWorkerThread(String name) {
        super(name);
    }

    private void postTask(Runnable task){
        myHandler.post(task);
    }

    private void setMyHandler(){
        myHandler=new Handler(getLooper());
    }
}

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    myWorkerThread=new MyWorkerThread("myWorkerThread");
    myWorkerThread.start();
    myWorkerThread.setMyHandler();
}

@OnClick(R.id.btn)
void getCount(){
    myWorkerThread.postTask(myRunnable);
}

我正在按照this blog post 中的示例进行操作,但我不确定我做错了什么并且它在运行时仍然会阻塞 UI。

【问题讨论】:

    标签: java android multithreading android-fragments


    【解决方案1】:

    从您的Runnable 中删除它:

    handler.post(new Runnable() {
    

    您正在发布您的Runnable,而后者又只是将Runnable 发布回主线程。所以你的主线程仍在做所有的工作。

    【讨论】:

      【解决方案2】:

      像这样修改runnable:-

      private Runnable myRunnable=new Runnable() {
      @Override
      public void run() {
            List<Item> list=db.getAllItems();
            Log.d(TAG,"Size: "+list.size());
      }};
      

      【讨论】:

      • @Scratte- 是的,你只需要像这样修改runnable并将runnable发布到handlerthread
      • Yes :) 删除 handler.post(new Runnable() { 将产生您提供的代码。请注意,发布几乎相同的答案可能会导致投反对票。
      • 我认为它比以前的答案更清晰
      猜你喜欢
      • 2021-12-02
      • 1970-01-01
      • 1970-01-01
      • 2011-06-02
      • 2019-02-11
      • 2011-07-22
      • 1970-01-01
      • 1970-01-01
      • 2016-03-16
      相关资源
      最近更新 更多