0

我想在 Timer 线程中触发 AsynTask,我收到以下错误。

java.lang.ExceptionInInitializerError 原因:java.lang.RuntimeException:无法在未调用 Looper.prepare() 的线程内创建处理程序

有没有可能???这是我的代码

networkTimer = new Timer();
                networkTimer.schedule(new TimerTask() {
                    int counter = 1;
                    @Override
                    public void run() {
                        // TODO Auto-generated method stub
                        if(isNetworkAvailable()){
                            Log.d("Hey I got the Network","!!");
                            new GmailAsync().execute("");
                            networkTimer.cancel();
                        }else{
                            Log.d("Attempt","No:"+counter);
                            counter++;
                            if(counter == 6){
                                Log.d("Attempt","Finished");
                                networkTimer.cancel();
                            }
                        }
                    }
                },0, 5000);
4

2 回答 2

1

AsyncTask.execute()必须在 UI 线程上运行,而 TimerTask 不会。

建议: * 使用 runOnUiThread 返回 UI 线程以使用您的 AsyncTask * 不要使用计时器,而是使用处理程序和 postDelyaed * 如果您不需要与 UI 交互(您可能,但我不知道你的 AsyncTask 做了什么。

最佳解决方案是#2。那看起来像:

mHandler.postDelayed(new Runnable() {
    @Override
    public void run() {
        if(isNetworkAvailable()){
            Log.d("Hey I got the Network","!!");
            new GmailAsync().execute("");
        }else{
            Log.d("Attempt","No:"+counter);
            counter++;
            if(counter == 6){
                Log.d("Attempt","Finished");
            } else {
                mHandler.postDelayed(this, 5000);
            }
        }
    }, 5000);
}

只要 counter < 6,runnable repost 本身

于 2012-11-23T10:40:55.390 回答
0

只需将对 FinderMain$1.gotLocation 的每次调用或在其中创建的 AsyncTask 封装在 Runnable 中,然后将其发布到绑定到 UI 线程的 Handler,如下所示:

class GetLastLocation extends TimerTask {
    private Handler mHandler = new Handler(Looper.getMainLooper());

        @Override
        public void run() {
           // ...
           mHandler.post(new Runnable() {
              public void run() {
                  locationResult.gotLocation(null);
              }
           });
           // ...
         }
    }
于 2012-11-23T10:42:47.530 回答