繁体   English   中英

从处理程序android调用asynctask

[英]Calling asynctask from handler android

我在为新应用程序进行测试时遇到问题。 我有一个活动,在该活动中,我执行asynctask与服务器进行通信并请求json文件。

我希望定期下载该文件(不知道需要3-4秒),所以我在自己的活动中创建了一个处理程序以每次执行该文件。

它可以与Logs一起正常工作,但是每当我尝试执行asynctask时,都会出现一个异常:

02-19 10:16:41.510: WARN/System.err(9051): java.lang.IllegalStateException: Cannot execute task: the task is already running.
02-19 10:16:41.510: WARN/System.err(9051): at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:576)
02-19 10:16:41.510: WARN/System.err(9051): at android.os.AsyncTask.execute(AsyncTask.java:535)
02-19 10:16:41.510: WARN/System.err(9051): at com.mobile.myPacket.mySecondActivity.askForData(mySecondActivity.java:68)
02-19 10:16:41.510: WARN/System.err(9051): at com.mobile.myPacket.mySecondActivity.access$000(mySecondActivity.java:22)
02-19 10:16:41.510: WARN/System.err(9051): at com.mobile.myPacket.mySecondActivity$1.run(mySecondActivity.java:56)
02-19 10:16:41.510: WARN/System.err(9051): at android.os.Handler.handleCallback(Handler.java:733)
02-19 10:16:41.510: WARN/System.err(9051): at android.os.Handler.dispatchMessage(Handler.java:95)
02-19 10:16:41.510: WARN/System.err(9051): at android.os.Looper.loop(Looper.java:136)
02-19 10:16:41.510: WARN/System.err(9051): at android.app.ActivityThread.main(ActivityThread.java:5017)
02-19 10:16:41.510: WARN/System.err(9051): at java.lang.reflect.Method.invokeNative(Native Method)
02-19 10:16:41.510: WARN/System.err(9051): at java.lang.reflect.Method.invoke(Method.java:515)
02-19 10:16:41.510: WARN/System.err(9051): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
02-19 10:16:41.510: WARN/System.err(9051): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
02-19 10:16:41.510: WARN/System.err(9051): at dalvik.system.NativeStart.main(Native Method)    

我认为这是因为这是另一个线程,第二个调用使第一个调用出现问题。 但是我不知道如何解决。

这是我的活动:

            package com.mobile.myPacket;

            import android.app.Activity;
            import android.os.Bundle;
            import android.os.Handler;
            import android.util.Log;
            import android.view.LayoutInflater;
            import android.view.View;
            import android.view.ViewGroup;
            import com.mobile.clases.AsyncResponse;
            import com.mobile.clases.MyTask;


            import android.os.Bundle;
            import android.view.LayoutInflater;
            import android.view.View;
            import android.view.ViewGroup;
            import org.json.JSONArray;
            import org.json.JSONException;
            import org.json.JSONObject;

            public class SecondActivity extends Activity implements AsyncResponse {

                private String urlServer = "url";
                MyTask asyncTask =new MyTask();
                Handler handler = new Handler();


                public void onCreate(Bundle savedInstanceState) {
                    super.onCreate(savedInstanceState);
                    handler.post(sendData);
                    setContentView(R.layout.secondActivity);
                    asyncTask.delegate = this;
                    //We ask for data the first time
                    askForData();
                }


                @Override
                public void processFinish(JSONArray output) {    //Executed from asyncTask
                    //Data received
                    Log.i("TEST", output.toString());
                }

                @Override
                protected void onDestroy() {
                    super.onDestroy();
                    handler.removeCallbacks(sendData);
                }

                private final Runnable sendData = new Runnable(){
                    public void run(){
                        try {
                            //prepare and send the data here..

                            askForData();
                           //Log.i("TEST","aa");
                                    handler.postDelayed(this, 3000);
                        }
                        catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                };

                private void askForData(){
                    Log.i("TEST","askForData");
                    asyncTask.execute(urlServer+"test.php");
                }


            }

没有处理程序,asyncTask只能正常工作一次。 所以我想上课还可以。

您不能多次执行同一AsyncTask

在执行AsyncTask之前,首先实例化一个新实例:

private void askForData(){
    asyncTask = new MyTask();
    asyncTask.delegate = this;
    asyncTask.execute(urlServer+"test.php");
}

还要在类的开头删除AsyncTask的实例化。

这样尝试

private void askForData(){

if (task.getStatus() == AsyncTask.Status.FINISHED) {
    task = new AsyncTask();
}

if (task.getStatus() != AsyncTask.Status.RUNNING) {
    task.execute();
}
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM