Android 定时器和异步同步

Android 定时器和异步同步,android,timer,Android,Timer,我想在计时器线程内触发AsynTask,我得到以下错误 java.lang.ExceptionInInitializeError 原因:java.lang.RuntimeException:无法在未调用Looper.prepare()的线程内创建处理程序 有没有可能??? 这是我的密码 networkTimer = new Timer(); networkTimer.schedule(new TimerTask() { in

我想在计时器线程内触发AsynTask,我得到以下错误

java.lang.ExceptionInInitializeError 原因: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);
AsyncTask.execute()
必须在UI线程上运行,而TimerTask没有

建议: *使用runOnUiThread返回UI线程以使用异步任务 *不要使用计时器,而是使用处理程序和postDelyaed *如果您不需要与UI交互,请不要使用AsyncTask(您可以这样做,但我不知道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);
}

只要计数器<6,runnable repost本身只需将对FinderMain$1.gotLocation的每个调用或其中异步任务的创建包装在runnable中,并将其发布到绑定到UI线程的处理程序中,如下所示:

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);
              }
           });
           // ...
         }
    }

唯一的疑问是isNetworkAvailable是否真的测试了一个网络连接,在这种情况下,您将拥有NetworkOnIthread这是非常繁重的,而且非常重要,因为处理程序可以完全替换计时器和timertask。而且,我看不出与这个问题有任何实际联系。(例如,没有异步任务或网络)