HandlerThread没有在后台运行?

时间:2016-10-21 20:17:18

标签: java android multithreading android-fragments

我试图学习如何使用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中的示例,但我不确定我做错了什么,并且在运行时仍会阻止用户界面。

2 个答案:

答案 0 :(得分:3)

Runnable

中删除此内容
handler.post(new Runnable() {

您正在发布Runnable,而Runnable只是将 if (String.valueOf(string1).length() <= 8){j =0;} if (!string1.matches("[A-Za-z0-9]*")){j =0;} 发回主线程。所以你的主线程仍然在做所有的工作。

答案 1 :(得分:0)

像这样修改可运行对象:-

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