2014-02-12 144 views
0

嗨,目前我有以下代码,它利用Asycn任务和计时器。Android定时异步任务

我的异步任务基本上是尝试从URL发送HTTP GET方法,其中服务器的响应可能因连接和负载而异。

我想做什么是有一个定时的异步任务。在哪里,它将每X秒安排一次AsyncTask,但是如果当前有一个异步任务正在进行,我将不得不先杀掉它。然后开始一个新的。

这里是我目前所面对的代码:

private static boolean running = false; 
Timer myTimer; 
protected void onCreate(Bundle savedInstanceState) { 
     /* REST OF CODE OMITTED */ 
     MyTimerTask myTask = new MyTimerTask(); 
     myTimer = new Timer(); 
     myTimer.schedule(myTask, 0, 10000); 
} 

/* REST OF CODE OMITTED */ 

private class MyTimerTask extends TimerTask { 
    public void run() { 
     if(!running){ 
      Log.i("TAG", "NEW TIMER STARTED."); 
      RetrieveChatMessage task = new RetrieveChatMessage(); 
      task.execute(); 
      running = true; 
     }else{ 
      running = false; 
     } 
    } 
} 

private class RetrieveChatMessage extends AsyncTask<String, Void, ArrayList<Chat>> { 
    @Override 
    protected ArrayList<Chat> doInBackground(String... params) { 
     // TODO Auto-generated method stub 
     ArrayList<Chat> cList = null; 
     String jResult = null; 

     Log.i("TAG", "RETRIEVING CHAT MESSAGE"); 

     try { 
      jResult = ((new HttpRetriever())).getChatList(mAccount.email, mAccount.passwd); 
     } catch (UnsupportedEncodingException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (NoSuchAlgorithmException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     try { 
      if(jResult != null){ 
       Log.i("TAG", "JSON DATA: " + jResult); 
       cList = (new ChatHandlers()).getChatList(jResult); 
      }else{ 
       cList = null; 
      } 
     } catch (JSONException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
      Log.e("TAG", "JSON Exception " + e.toString()); 
     } 

     return cList; 
    } 

    @Override 
    protected void onPostExecute(final ArrayList<Chat> result) { 
     Log.i("TAG", "ON POST EXECUTE"); 
     if(result != null){ 
       // Do something here 
     } 
    } 
} 

说实话上面的代码有轻微问题的工作:1。 这似乎随机执行异步,而不是每10秒。 2.当我去到另一个活动,有点它阻止其他异步任务做它的工作(也试图从服务器检索JSON响应)。

我不太担心后面的问题(这不是我问的问题)。我只想知道如何有适当的定时异步任务。任何人都可以指出我的方向。

谢谢。

编辑#1:

scheduleTaskExecutor= Executors.newScheduledThreadPool(5); 
scheduleTaskExecutor.scheduleAtFixedRate(new Runnable() { 
    public void run() { 
     // Parsing RSS feed: 
     // myFeedParser.doSomething(); 
     Log.w("THUMBQOO", "NEW TASK STARTED"); 
     retrieveChat(); 
    } 
    }, 0, 15, TimeUnit.SECONDS); 

结果:

阅读@thepoosh评论的我尝试以下(我把它的onCreate)后,我有任务的一致执行。但是,似乎retrieveChat();在第一次执行后永远不会被调用。

+1

你应该使用'ScheduledPoolExecutor'代替定时器 – thepoosh

+0

你能否详细说明吗?也许有一个例子?谢谢 – Jeremy

回答

0

我不知道这是否是(以下这里我的回答)完成这个的一个非常好的方法:

使用处理,营造HandlerThread并保持发布消息到此处理。 对于处理程序“handleMessage”方法,您可以执行任务并再次将消息发送回MessageQueue。

HandlerThread thread = new HandlerThread(<name>); 
thread.start(); 

Looper looper = thread.getLooper(); 
CustomHandler handler = new CustomHandler(looper); 

// The CustomHandler class 
class CustomHandler extends Handler { 

     public CustomHandler(Looper looper) { 
      super(looper); 
     } 

     @Override 
     public void handleMessage(Message msg) { 
      //Do your operation here 

      handler.sendEmptyMessageDelayed(msg, <delayTime>); 
     } 
} 
0

其实AsyncTask不能用于长时间操作。检查Here

你应该使用使用接口Thread通知UI或者你可以简单地使用Handler这是在Android上最较受欢迎的方式。只要你可以反复每10秒

handler.postDelayed(new Runnable() { 
@Override 
public void run() { 
    // do work 
    handler.postDelayed(10000); 
} 
}, 10000); 
0

做一个任务声明Handler对象,以保持未来任务执行...

private Handler mTimerHandler = new Handler(); 

写线程将执行你的未来任务...

private Runnable mTimerExecutor = new Runnable() { 

    @Override 
    public void run() { 

     //write your code what you want to do after the specified time elapsed 

     if(!running){ 
      RetrieveChatMessage task = new RetrieveChatMessage(); 
      task.execute(); 
      running = true; 
     }else{ 
      running = false; 
     } 

    } 
}; 

使用hanlder随时调用您的未来tast执行器...

mTimerHandler.postDelayed(mTimerExecutor, 10000); 

您可以CANCLE你的未来任务执行这个任何时候...

mTimerHandler.removeCallbacks(mTimerExecutor);