我正在处理需要将文件上传到服务器的应用。但要上传需要登录(工作)的文件然后获取网址(正在工作)然后上传(强制关闭)
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)
我的代码:(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();
}
}
调用邮政编码(handleJsonObject)的代码(aSync):
asyncTask.setJsonListener(new JsonListener() {
public void onObjectReturn(JSONObject object) {
handleJsonObject(object);
}
});
asyncTask.execute("http://api.bayfiles.net/v1/file/uploadUrl?session=" + sessionId);
我无法弄清楚为什么代码不起作用? 非常感谢任何帮助!
答案 0 :(得分:28)
正如异常本身所解释的那样,您不能多次执行AsyncTask
,除非您创建new
个实例并致电.execute
。
例如:
async = new AsyncTask();
async.execute();
*为了执行多次,您需要重新创建实例(使用new
)执行的次数。
答案 1 :(得分:0)
我使用此代码,它适用于我:
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);
}
答案 2 :(得分:0)
您可以通过使用async.cancel(true)调用async实例来取消,这样就可以确保只有一个async实例
答案 3 :(得分:-1)
您不能多次执行AsyncTask,因此要修复此错误,只需将其包装在以下条件中: async = new AsyncTask();
if (async==null){
async.execute();
}
当您尝试在viewpager中运行Asynctask时,通常会发生此错误。当您在片段中运行asynctask并滑动到下一个片段时,返回到上一个片段会触发重新执行该片段中的asynctask,从而导致应用程序崩溃。因此,您必须通过将asynctask包装在一个条件中来检查是否已经执行了asynctask。