2013-10-13 18 views
8

Tôi đang làm việc trên ứng dụng cần tải tệp lên máy chủ. Tuy nhiên, để tải lên các tập tin cần thiết để đăng nhập (làm việc) sau đó lấy url (làm việc) sau đó tải lên (Force Close)Tác vụ aSync không thể được thực thi hai lần

Các 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) 

Mã của tôi: (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(); 
     } 
    } 

mã (async) những cuộc gọi đoạn code sau (handleJsonObject):

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

tôi không thể figu tại sao mã không hoạt động? Bất kỳ trợ giúp nào được đánh giá cao!

+0

Lỗi có nguồn gốc trong hoạt động của bạn. Bạn cần phải đăng mã đó. – SBerg413

Trả lời

28

Vì ngoại lệ tự giải thích, bạn không thể thực thi nhiều hơn một lần, trừ khi bạn tạo một phiên bản new của cuộc gọi và gọi .execute.

Ví dụ:

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

* để thực hiện nhiều hơn một lần, bạn cần phải tạo lại dụ (sử dụng new) số lần bạn muốn thực hiện nó.

+0

tôi chỉ cần gọi nó một lần? không tôi? –

+0

Đừng bận tâm :) Đã làm việc, cảm ơn :) –

+0

điều này không hoạt động – Darrell

-1

Bạn không thể thực hiện AsyncTask nhiều lần, do đó, để khắc phục lỗi này, chỉ cần bọc nó trong một điều kiện như sau: async = new AsyncTask();

    if (async==null){ 

        async.execute(); 

        } 

Lỗi này thường xảy ra khi bạn cố gắng chạy Asynctask trong chế độ xem. Khi bạn chạy asynctask trong một đoạn và vuốt đến đoạn tiếp theo, quay trở lại đoạn trước đó sẽ kích hoạt việc thực hiện lại asynctask trong đoạn đó làm cho ứng dụng gặp sự cố. Vì vậy, bạn phải kiểm tra xem asynctask đã được thực hiện hay chưa bằng cách gói nó trong một điều kiện.

0

tôi sử dụng đoạn mã này và nó làm việc cho tôi:

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

Bạn có thể hủy bằng cách gọi dụ async với async.cancel (true) để bạn có thể đảm bảo chỉ có một thể hiện của async

Các vấn đề liên quan