嗨,目前我有以下使用Asycn任务和计时器的代码。
我的异步任务基本上是尝试从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
}
}
}
说实话,上面的代码可以解决一些问题: 它似乎是随机执行Async,而不是每10秒执行一次。 2.当我转到另一个活动时,它会阻止其他异步任务执行其工作(它也试图从服务器检索JSON响应)。
我对后来的问题并不太担心(这不是我要问的问题)。我只是想知道如何有一个适当的定时异步任务。任何人都可以指出我的方向。
谢谢。
编辑#1:
阅读@thepoosh评论后,我尝试了以下内容(我把它放在onCreate上):
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);
结果:我有一致的Task任务。但是,似乎retrieveChat();在第一次执行后永远不会被调用。
答案 0 :(得分:0)
我不确定这是否是一种很好的完成方式(我的答案如下):
使用Handler,创建一个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>);
}
}
答案 1 :(得分:0)
实际上AsyncTask
不会用于长时间操作。请查看Here
您应该使用使用接口通知Thread
的{{1}},或者您可以使用UI
这是Android中最常用的方式。只需按照
Handler
答案 2 :(得分: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随时调用你未来的尝试执行者......
mTimerHandler.postDelayed(mTimerExecutor, 10000);
你可以随时用你的未来任务执行者...
mTimerHandler.removeCallbacks(mTimerExecutor);