如何重新运行任务

时间:2014-08-05 16:16:21

标签: java android android-asynctask illegalstateexception

我有一个正在运行的任务,如果它失败了,我想再次运行它三次。问题在于Android因为试图在自己的内部运行任务而生气。什么是最好的解决方法?

代码(查看底部的task.callback):

final GenericAsyncTask task = new GenericAsyncTask();

        task.background = new Runnable() {
            public void run() {
                HttpClient httpclient = new DefaultHttpClient();
                HttpPost httppost = new HttpPost(GCMIntentService.this.host);
                String addremove = "add";
                if(register == false) addremove = "remove";

                try {
                    // Add your data
                    List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(4);
                    nameValuePairs.add(new BasicNameValuePair("cmd", addremove));
                    nameValuePairs.add(new BasicNameValuePair("subscription_key", SUBSCRIPTION_KEY)); // unique per app
                    nameValuePairs.add(new BasicNameValuePair("token", str));
                    nameValuePairs.add(new BasicNameValuePair("os_family", "android"));
                    if(addremove.equals("remove")) nameValuePairs.add(new BasicNameValuePair("hard", "" + hard));
                    UrlEncodedFormEntity entity = new UrlEncodedFormEntity(nameValuePairs);
                    httppost.setEntity(entity);
                    Log.i(LCHApplication.TAG, "Name Value Pairs: " + nameValuePairs.toString());

                    // Execute HTTP Post Request
                    HttpResponse response = httpclient.execute(httppost);
                    task.result = EntityUtils.toString(response.getEntity());
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        };

        task.callback = new Runnable() {
            public void run() {
                try {
                    Log.i(LCHApplication.TAG, "registration response: " + task.result.toString());
                } catch(Exception e) {
                    if(attempts++ < ATTEMPTS_LIMIT) {
                        // try to register the device again
                        task.execute();
                    } else {
                        Crashlytics.logException(e);
                    }
                }
            }
        };

        task.execute();

3 个答案:

答案 0 :(得分:2)

  

问题在于Android因为试图在其内部运行任务而感到生气

除此之外,AsyncTask是一次性使用对象。您无法重新execute() AsyncTask个实例。

  

解决这个问题的最佳方法是什么?

创建AsyncTask的新实例。例如,您可以实现一个复制构造函数,可用于从先前执行的实例中克隆新实例。

或者,请勿使用AsyncTask

由于Android SDK中没有GenericAsyncTask,我不能说,这对任何GenericAsyncTask都有效。

答案 1 :(得分:1)

在实际任务中重试,不要重新运行它。如果您需要重新运行任务,请通过第三方进行。

答案 2 :(得分:0)

在这种情况下,我建议的方法是采用Handler,每次捕获异常时都会发布一条消息以供执行(最多3次)。我发现它更灵活的方法,特别是当你需要经常运行时某些任务。

 private final Handler handler = new Handler() {

     public void handleMessage(Message msg) {

           if(msg.what == YOUR_MESSAGE_TYPE){
            try {
                Log.i(LCHApplication.TAG, "registration response: " + task.result.toString());
            } catch(Exception e) {
                if(attempts++ < ATTEMPTS_LIMIT) {
                    // try to register the device again
                    handler.sendEmptyMsg(YOUR_MESSAGE_TYPE);
                } else {
                    Crashlytics.logException(e);
                }
            }
        }    
     }

};

最后,您必须将其与后台HandlerThread相关联。