Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/203.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 多个活动的通用异步任务_Android_Android Asynctask - Fatal编程技术网

Android 多个活动的通用异步任务

Android 多个活动的通用异步任务,android,android-asynctask,Android,Android Asynctask,嗨,我正在尝试在android中实现一个通用的异步任务。我有大约8到10个活动,它们使用相同的异步任务和不同的参数。任务对于每个活动都很有效。但当我尝试实现UI组件时,它崩溃了。这是我的代码,有什么建议吗 public class SyncTaskService extends AsyncTask<String, Void, Void> { OnAsyncResult onAsyncResult; String ServerResponse; String

嗨,我正在尝试在android中实现一个通用的异步任务。我有大约8到10个活动,它们使用相同的异步任务和不同的参数。任务对于每个活动都很有效。但当我尝试实现UI组件时,它崩溃了。这是我的代码,有什么建议吗

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); 
    }
这是我们的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
您需要重写onPostExecuted方法。Asynctask基本上有4个重要方法,其中三个在UI线程上执行,一个在后台异步线程中执行:

onPreExecute-在UI线程上执行,在执行后台进程之前,您应该在UI上执行任何您想要的操作,例如显示进度条 doInBackground-在后台线程上执行,在这里,您应该在UI线程下执行任何繁重的任务,以便您的应用程序不会崩溃或UI不会挂起。进行API调用以下载。请记住,您不能在此处与任何UI元素交互!您也可以从这里发布进度,例如返回每200kb下载的文件大小,以便更新进度条 onPostExecute-在UI线程上执行,在该线程中,您应该在任务执行后处理在UI上要执行的所有操作,例如,关闭进度条并显示下载文件的结果 onProgressUpdate-在UI线程上执行,当任何doInBackground发布进度时,这样您就可以在后台进程较长的情况下保持用户更新。例如,在此处更新进度条百分比 希望这有帮助。您可能还想查看文档,这些文档可能会帮助您进一步了解Asynctask的全部功能


您正在尝试访问异步任务中的UI线程,因此,一旦我在ServerResponse stringonPostExcecute方法中获得值,我应该在哪里进行处理?这意味着我必须在我的活动中创建一个PostExecute方法?实际上,您从doInBackground返回null,这会导致错误谢谢Qazi。但我使用了RunNuithread方法,效果很好。
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