HandlerThread没有在后台运行吗?

3
我正在尝试学习如何使用HandlerThread在后台运行程序。我有一个在fragment中的按钮,当单击时,我要从数据库中获取条目数。但实际运行时,logcat显示应用程序可能在主线程上执行了过多的工作,而我不知道自己做错了什么。
以下是我在fragment中排列代码的方式:
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);
}

我正在遵循这篇博客文章中的示例,但我不确定我做错了什么,它仍然会在运行时阻塞UI。

2个回答

3

从你的Runnable中删除此部分:

handler.post(new Runnable() {

你正在发布一个Runnable,该Runnable会将另一个Runnable回传到主线程中。因此,你的主线程仍在执行所有工作。

0

将可运行对象修改为以下形式:

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

@Scratte- 是的,你只需要像这样修改runnable,然后将其post到handlerthread即可。 - Chandan Dwivedi
是的 :) 删除 handler.post(new Runnable() { 将导致您呈现的代码。请注意,发布几乎相同的答案可能会导致投票下降。 - Scratte
我认为这个回答比之前的更清晰明了。 - Chandan Dwivedi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接