2014-11-08 75 views
0

嗨我想在android中实现一个通用的Asynctask。我有大约8到10个活动,它使用具有不同参数的相同的asynctask。任务适用于每项活动。但是当我尝试实现UI组件时,它会崩溃。这里是我的代码有什么建议多种活动的通用Asynctask

public class SyncTaskService extends AsyncTask<String, Void, Void> { 
    OnAsyncResult onAsyncResult; 
    String ServerResponse; 
    String LocalResponse; 
    int Operationtype=-1; 

    private Context mContext; 
    public SyncTaskService (Context context){ 
     mContext = context; 
    } 

    public void setOnResultListener(OnAsyncResult onAsyncResult) { 
     if (onAsyncResult != null) { 
      this.onAsyncResult = onAsyncResult; 
     } 
    } 

    @Override 
    protected Void doInBackground(String... params) { 
     BackGroundTasks Obj_BackGroungTasks = new BackGroundTasks(); 
     Operationtype = Integer.parseInt(params[0]); 
     if (onAsyncResult != null) 
     { 
      switch (Operationtype) { 
      case 1: 
       String Type = params[2]; 
       ServerResponse=null; 
       ServerResponse= Obj_BackGroungTasks.getdetails(mContext,Type); 
       break; 
      default: 
       break; 
      } 
     } 
     if (ServerResponse!=null) { 
      onAsyncResult.onResultSuccess(ServerResponse); 
     } else { 
      onAsyncResult.onResultFail(ServerResponse +LocalResponse); 
     } 
     return null; 
    } 
    public interface OnAsyncResult { 
     public abstract void onResultSuccess(String message); 
     public abstract void onResultFail(String errorMessage); 
    } 

,这是我如何使用它在我的活动

SyncTaskService task = new SyncTaskService(getActivity()); 
    task.setOnResultListener(asynResult); 
    task.execute("5",promotype); 


OnAsyncResult asynResult = new OnAsyncResult() { 
     @Override 
     public void onResultFail(final String errorMessage) { 
      Log.d("On Result Fail In Activity", ""+errorMessage); 
      Toast.makeText(getActivity(), "Task completed", Toast.LENGTH_LONG).show(); 

     } 
     @Override 
     public void onResultSuccess(String message) { 
      Log.d("On Result Success In Activity", ""+message); 
      ServerResponse=message; 
      Toast.makeText(getActivity(), "Task completed", Toast.LENGTH_LONG).show(); //craches here 
     } 


     }; 

这里我们logcat的

11-08 16:25:17.705: E/AndroidRuntime(671): FATAL EXCEPTION: AsyncTask #1 
11-08 16:25:17.705: E/AndroidRuntime(671): java.lang.RuntimeException: An error occured while executing doInBackground() 
11-08 16:25:17.705: E/AndroidRuntime(671): at android.os.AsyncTask$3.done(AsyncTask.java:278) 
11-08 16:25:17.705: E/AndroidRuntime(671): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273) 
11-08 16:25:17.705: E/AndroidRuntime(671): at java.util.concurrent.FutureTask.setException(FutureTask.java:124) 
11-08 16:25:17.705: E/AndroidRuntime(671): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307) 
11-08 16:25:17.705: E/AndroidRuntime(671): at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
11-08 16:25:17.705: E/AndroidRuntime(671): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:208) 
11-08 16:25:17.705: E/AndroidRuntime(671): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 
11-08 16:25:17.705: E/AndroidRuntime(671): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 
11-08 16:25:17.705: E/AndroidRuntime(671): at java.lang.Thread.run(Thread.java:856) 
11-08 16:25:17.705: E/AndroidRuntime(671): Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() 
11-08 16:25:17.705: E/AndroidRuntime(671): at android.os.Handler.<init>(Handler.java:121) 
11-08 16:25:17.705: E/AndroidRuntime(671): at android.widget.Toast$TN.<init>(Toast.java:317) 
11-08 16:25:17.705: E/AndroidRuntime(671): at android.widget.Toast.<init>(Toast.java:91) 
11-08 16:25:17.705: E/AndroidRuntime(671): at android.widget.Toast.makeText(Toast.java:233) 
11-08 16:25:17.705: E/AndroidRuntime(671): at packagename.Activity$1.onResultFail(Activity.java:157) 
11-08 16:25:17.705: E/AndroidRuntime(671): at packagename.SyncTaskService.doInBackground(SyncTaskService.java:115) 
11-08 16:25:17.705: E/AndroidRuntime(671): at packagename.SyncTaskService.doInBackground(SyncTaskService.java:1) 
11-08 16:25:17.705: E/AndroidRuntime(671): at android.os.AsyncTask$2.call(AsyncTask.java:264) 
11-08 16:25:17.705: E/AndroidRuntime(671): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 
11-08 16:25:17.705: E/AndroidRuntime(671): ... 5 more 
+0

您尝试访问UI线程在异步任务 – Amy 2014-11-08 11:41:47

+0

所以我应该在哪里做我的处理一旦我在ServerResponse串 – DreamCoder 2014-11-08 11:43:15

+0

onPostExcecute方法 – Amy 2014-11-08 11:44:02

回答

0

你需要重写onPostExecuted()方法。基本上,的AsyncTask有4种重要的方法,其中三个执行UI线程和其中一个执行后台异步线程:

  1. onPreExecute() - UI线程,你应该之前,做任何你想要在UI上执行你的后台进程执行前。显示一个进度条
  2. doInBackground() - 在后台线程上执行,这是你应该做任何繁重的任务需要做的关闭UI线程,以便您的应用程序不会崩溃或您的用户界面不会挂死前。进行API调用以下载。请记住,您无法与此处的任何UI元素交互!你也可以从这里发布进度。返回文件大小每200kb下载一次,以便进度条可以更新
  3. onPostExecute() - 在UI线程上执行,您应该在任务执行完毕后处理UI上要做的所有事情。关闭进度条并显示下载文件的结果
  4. onProgressUpdate() - 在UI线程上执行时doInBackground()发布进度,以便在出现长时间后台进程的情况下保持用户更新。在这里更新你的进度栏百分比

希望这会有所帮助。您可能还想看看可能帮助您进一步了解Asynctask全部功能的文档。

https://developer.android.com/reference/android/os/AsyncTask.html

+0

谢谢Qazi,但我已经使用了RunOnUiThread方法,并且对我很好。 – DreamCoder 2014-11-10 21:06:48