Java HandlerThread&x27;不在后台运行?

Java HandlerThread&x27;不在后台运行?,java,android,multithreading,android-fragments,Java,Android,Multithreading,Android Fragments,我正在尝试学习如何使用HandlerThread在后台运行东西。我在片段中有一个按钮,单击该按钮时,我希望从数据库中获取条目数。但是当我实际运行它时,logcat说应用程序可能在主线程上做了太多的工作,我不知道我做错了什么 下面是我如何在片段中排列代码的: private Handler=new Handler(); 私有MyWorkerThread MyWorkerThread; private Runnable myRunnable=new Runnable(){ @凌驾 公开募捐{ han

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

下面是我如何在片段中排列代码的:

private Handler=new Handler();
私有MyWorkerThread MyWorkerThread;
private Runnable myRunnable=new Runnable(){
@凌驾
公开募捐{
handler.post(新的Runnable(){
@凌驾
公开募捐{
List=db.getAllItems();
Log.d(标记“Size:+list.Size());
}
});
}
};
私有类MyWorkerThread扩展了HandlerThread{
私有处理器myHandler;
私有MyWorkerThread(字符串名称){
超级(姓名);
}
私有void postTask(可运行任务){
myHandler.post(任务);
}
私有void setMyHandler(){
myHandler=新处理程序(getLooper());
}
}
@凌驾
创建时的公共void(@Nullable Bundle savedInstanceState){
super.onCreate(savedInstanceState);
myWorkerThread=新的myWorkerThread(“myWorkerThread”);
myWorkerThread.start();
myWorkerThread.setMyHandler();
}
@OnClick(R.id.btn)
void getCount(){
myWorkerThread.postTask(myRunnable);
}

我遵循中的示例,但我不确定我做错了什么,它仍然会在运行时阻塞UI

将其从您的
可运行文件中删除:

handler.post(new Runnable() {

您正在发布您的
Runnable
,这反过来只会将
Runnable
发布回主线程。因此,主线程仍在执行所有工作。

修改runnable如下:-

private Runnable myRunnable=new Runnable() {
@Override
public void run() {
      List<Item> list=db.getAllItems();
      Log.d(TAG,"Size: "+list.size());
}};
private Runnable myRunnable=new Runnable(){
@凌驾
公开募捐{
List=db.getAllItems();
Log.d(标记“Size:+list.Size());
}};

@Scratte-是的,您只需要像这样修改runnable并将runnable发布到handlerthreadYes:)删除
handler.post(new runnable(){
将生成您显示的代码。请注意,发布几乎相同的答案可能会导致否决票。我认为它比以前的答案更清晰