等待主线程上的runnable在Android中完成的最佳方法是什么?

时间:2014-03-25 04:24:49

标签: java android multithreading concurrency

我需要从WebViewClient#shouldInterceptRequest内的用户收集用户名和密码,因此我必须阻止WebView IO线程,直到用户在主线程上提供用户名和密码。等待我的runnable完成的最佳方法是什么?

我目前最喜欢的方式是(为简洁省略了例外和超时):

final CountDownLatch countDownLatch = new CountDownLatch(1);
new Handler(Looper.getMainLooper()).post(new Runnable() {
  public void run() {
    callSomethingWithAsyncCallback(new Runnable() {
      public void run() {
        countDownLatch.countDown();
      }
    });
  }
});
countDownLatch.await();

使用ExecutorService的东西似乎更好,因为我可以简单地使用Future#get来阻止。但是,主线程上没有运行ExecutorService,而使用Executors中的一个只是将其反弹到主线程似乎很浪费。想法?

1 个答案:

答案 0 :(得分:0)

请使用AsyncTask而不是使用runnable。

  • AsyncTask执行另一个线程内的doInBackground()中的所有内容,该线程无权访问您的视图所在的GUI。
  • preExecute()和postExecute()使您可以在此新线程发生繁重之前和之后访问GUI,甚至可以将long操作的结果传递给postExecute(),然后显示任何处理结果。