2014-02-19 4 views
1

새 앱에 대한 테스트를하는 동안 문제가 있습니다. asynctask를 실행하여 내 서버와 통신하고 json 파일을 요청하는 활동이 있습니다.asynctask from handler android

주기적으로이 파일을 다운로드하고 싶습니다 (3 ~ 4 초). 그래서 매번 활동을 처리하기 위해 처리기를 만들었습니다.

그것은 로그와 잘 작동하지만 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를 잘 한 시간을 작동합니다

내 활동이다. 그래서 그 수업은 괜찮아요.

답변

2

동일한 AsyncTask을 여러 번 실행할 수 없습니다.

AsyncTask을 실행하기 전에, 먼저 새 인스턴스를 인스턴스화 :

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

또한 클래스의 시작 부분에 AsyncTask의 인스턴스를 제거합니다.

+0

당신은 사람이며, 다음과 같이하십시오. 그것은 작동합니다. 나는이 일에 대해 생각하고 있었다. – Biribu

0

private void askForData(){ 

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

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