2016-10-21 7 views
3

HandlerThreadを使ってバックグラウンドで動作させる方法を学びたいと思っています。私は、クリックすると、データベースからエントリの数を取得したいという断片のボタンがあります。しかし、実際に実行すると、アプリケーションがメインスレッドであまりにも多くの作業をしている可能性があり、私が間違っていたことはわかりません。HandlerThreadはバックグラウンドで実行されませんでしたか?

ここで私はフラグメントに私のコードを配置し、次をご覧ください。

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 。

答えて

3

あなたRunnableからこれを削除します。

handler.post(new Runnable() { 

あなたは順番にちょうど、メインスレッドにRunnableバックをポストあなたのRunnableを掲示しています。あなたのメインスレッドはまだすべての作業をしています。

関連する問題