Android定时异步任务

时间:2014-02-12 08:39:09

标签: android asynchronous android-asynctask

嗨,目前我有以下使用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();在第一次执行后永远不会被调用。

3 个答案:

答案 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中最常用的方式。只需按照

每10秒重复执行一项任务
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);