嗨,目前我有以下代码,它利用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();在第一次执行后永远不会被调用。
你应该使用'ScheduledPoolExecutor'代替定时器 – thepoosh
你能否详细说明吗?也许有一个例子?谢谢 – Jeremy