2013-10-13 6 views
8

Sto lavorando all'app che deve caricare un file sul server. Ma per caricare i file necessari per effettuare il login (di lavoro) quindi ottenere l'url (di lavoro) poi caricare (Forza Chiudi)aSync L'attività non può essere eseguita due volte

Il logcat:

10-13 14:10:27.494: E/AndroidRuntime(26578): FATAL EXCEPTION: main 
10-13 14:10:27.494: E/AndroidRuntime(26578): java.lang.IllegalStateException: Cannot execute task: the task has already been executed (a task can be executed only once) 
10-13 14:10:27.494: E/AndroidRuntime(26578): at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:578) 
10-13 14:10:27.494: E/AndroidRuntime(26578): at android.os.AsyncTask.execute(AsyncTask.java:534) 
10-13 14:10:27.494: E/AndroidRuntime(26578): at com.spxc.bayfiles.FilesActivity.onOptionsItemSelected(FilesActivity.java:294) 
10-13 14:10:27.494: E/AndroidRuntime(26578): at com.actionbarsherlock.app.SherlockActivity.onMenuItemSelected(SherlockActivity.java:208) 
10-13 14:10:27.494: E/AndroidRuntime(26578): at com.actionbarsherlock.ActionBarSherlock.callbackOptionsItemSelected(ActionBarSherlock.java:603) 
10-13 14:10:27.494: E/AndroidRuntime(26578): at com.actionbarsherlock.internal.ActionBarSherlockNative.dispatchOptionsItemSelected(ActionBarSherlockNative.java:93) 
10-13 14:10:27.494: E/AndroidRuntime(26578): at com.actionbarsherlock.app.SherlockActivity.onOptionsItemSelected(SherlockActivity.java:159) 
10-13 14:10:27.494: E/AndroidRuntime(26578): at android.app.Activity.onMenuItemSelected(Activity.java:2566) 
10-13 14:10:27.494: E/AndroidRuntime(26578): at com.android.internal.policy.impl.PhoneWindow.onMenuItemSelected(PhoneWindow.java:986) 
10-13 14:10:27.494: E/AndroidRuntime(26578): at com.android.internal.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:735) 
10-13 14:10:27.494: E/AndroidRuntime(26578): at com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:152) 
10-13 14:10:27.494: E/AndroidRuntime(26578): at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:874) 
10-13 14:10:27.494: E/AndroidRuntime(26578): at com.android.internal.view.menu.ActionMenuView.invokeItem(ActionMenuView.java:547) 
10-13 14:10:27.494: E/AndroidRuntime(26578): at com.android.internal.view.menu.ActionMenuItemView.onClick(ActionMenuItemView.java:115) 
10-13 14:10:27.494: E/AndroidRuntime(26578): at android.view.View.performClick(View.java:4240) 
10-13 14:10:27.494: E/AndroidRuntime(26578): at android.view.View$PerformClick.run(View.java:17721) 
10-13 14:10:27.494: E/AndroidRuntime(26578): at android.os.Handler.handleCallback(Handler.java:730) 
10-13 14:10:27.494: E/AndroidRuntime(26578): at android.os.Handler.dispatchMessage(Handler.java:92) 
10-13 14:10:27.494: E/AndroidRuntime(26578): at android.os.Looper.loop(Looper.java:137) 
10-13 14:10:27.494: E/AndroidRuntime(26578): at android.app.ActivityThread.main(ActivityThread.java:5103) 
10-13 14:10:27.494: E/AndroidRuntime(26578): at java.lang.reflect.Method.invokeNative(Native Method) 
10-13 14:10:27.494: E/AndroidRuntime(26578): at java.lang.reflect.Method.invoke(Method.java:525) 
10-13 14:10:27.494: E/AndroidRuntime(26578): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) 
10-13 14:10:27.494: E/AndroidRuntime(26578): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
10-13 14:10:27.494: E/AndroidRuntime(26578): at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:112) 
10-13 14:10:27.494: E/AndroidRuntime(26578): at dalvik.system.NativeStart.main(Native Method) 

Il mio codice: (handleJsonObject):

private void handleJsonObject(JSONObject object) { 

     try { 
      sUpload = object.getString("uploadUrl");    
      HttpClient httpclient = new DefaultHttpClient(); 

      //post request to send the video 

      File sdCardRoot = Environment.getExternalStorageDirectory(); 
      File myDir = new File(sdCardRoot, "Download"); 

      HttpPost httppost = new HttpPost(sUpload); 
      StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); 
      StrictMode.setThreadPolicy(policy); 
      FileBody video_file1 = new FileBody(new File(myDir + "/test.txt")); 
      MultipartEntity reqEntity = new MultipartEntity(); 
      reqEntity.addPart("file=", video_file1);      
      httppost.setEntity(reqEntity); 

      // DEBUG 
      System.out.println("executing request " + httppost.getRequestLine()); 
      HttpResponse response = null; 
      try { 
       response = httpclient.execute(httppost); 
      } catch (ClientProtocolException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      HttpEntity resEntity = response.getEntity(); 

      // DEBUG 
      System.out.println(response.getStatusLine()); 
      if (resEntity != null) { 
       try { 
       System.out.println(EntityUtils.toString(resEntity)); 
      } catch (org.apache.http.ParseException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      } // end if 
      if (resEntity != null) { 
       try { 
       resEntity.consumeContent(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      } // end if 

      httpclient.getConnectionManager().shutdown(); 


     } catch (JSONException e) { 
      Log.e("log_tag", "Error parsing data: " + e.toString()); 
      Crouton.makeText(this, "Something went wrong!", Style.ALERT).show(); 
     } 
    } 

il codice (asincrona) che chiama il codice postale (handleJsonObject):

asyncTask.setJsonListener(new JsonListener() { 
       public void onObjectReturn(JSONObject object) { 
        handleJsonObject(object); 
       } 
      }); 
      asyncTask.execute("http://api.bayfiles.net/v1/file/uploadUrl?session=" + sessionId); 

non posso Figu rievocare perché il codice non funzionerà? Qualsiasi aiuto è molto apprezzato!

+0

L'errore è originario della tua attività. Devi pubblicare quel codice. – SBerg413

risposta

28

Come l'eccezione stessa spiega, non è possibile eseguire uno AsyncTask più di una volta, a meno che non si crei un'istanza new e si chiami .execute.

Ad esempio:

async = new AsyncTask(); 
async.execute(); 

* al fine di eseguire più di una volta, è necessario ricreare l'istanza (utilizzando new) il numero di volte che si desidera eseguire esso.

+0

lo chiamo semplicemente una volta? non io? –

+0

Non importa :) Ha funzionato, grazie :) –

+0

questo non funziona – Darrell

-1

Non è possibile eseguire AsyncTask più di una volta, pertanto per risolvere questo errore, è sufficiente avvolgerlo in una condizione come questa: async = new AsyncTask();

    if (async==null){ 

        async.execute(); 

        } 

Questo errore si verifica in genere quando si tenta di eseguire Asynctask in un viewpager. Quando si esegue asynctask in un frammento e si scorre il frammento successivo, il ritorno al frammento precedente attiva una ri-esecuzione del asynctask in quel frammento causando l'arresto anomalo dell'app. Pertanto, è necessario verificare se l'asynctask è già stato eseguito avvolgendolo in una condizione.

0

io uso questo codice e funziona per me:

if ((eliminar_op_async != null) && eliminar_op_async.getStatus() == AsyncTask.Status.RUNNING) { 
     if (eliminar_op_async.isCancelled()) { 
      eliminar_op_async = new EliminarOperacion(); 

      eliminar_op_async.execute(id_operacion,posicion_operacion); 
     } 
     else { 
      // Nada 
     } 
    } 

    if ((eliminar_op_async != null) && eliminar_op_async.getStatus() == AsyncTask.Status.PENDING) { 
     eliminar_op_async.execute(id_operacion,posicion_operacion); 
    } 

    if ((eliminar_op_async != null) && eliminar_op_async.getStatus() == AsyncTask.Status.FINISHED) { 
     eliminar_op_async = new EliminarOperacion(); 

     eliminar_op_async.execute(id_operacion,posicion_operacion); 
    } 

    if (eliminar_op_async == null) { 
     eliminar_op_async = new EliminarOperacion(); 

     eliminar_op_async.execute(id_operacion,posicion_operacion); 
    } 
0

è possibile annullare chiamando esempio asincrona con async.cancel (vero) in modo da poter assicurare che ci sia una sola istanza di asincrona