0

Hi I am trying to implement a generic Asynctask in android. I have around 8 to 10 activities which uses same asynctask with different parameters. Task works well for each activity. But when I try to implement a UI component it crashes. Here is my code any suggestions

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); 
    }

and this is how I am using it in my activity

    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
        }  


        };  

Here us 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
DreamCoder
  • 21
  • 2

1 Answers1

0

You need to override onPostExecuted() method. Basically, Asynctask has 4 important methods, three of which execute on the UI thread and one which executes in a background asynchronous thread:

  1. onPreExecute() - executed on the UI thread where you should do whatever you want on the UI before your background process is executed ex. show a progress bar
  2. doInBackground() - executed on a background thread and this is where you should do whatever heavy task need to do off the UI thread so that your app doesn't crash or your UI doesn't hang ex. make an API call to download. REMEMBER THAT YOU CANNOT INTERACT WITH ANY UI ELEMENTS HERE! You can also publish progress from here ex. Return file size downloaded every 200kb so that your progress bar can update
  3. onPostExecute() - executed on the UI thread where you should handle everything you want to do on the UI after your task has executed ex. dismiss progress bar and show result of downloading file
  4. onProgressUpdate() - executed on the UI thread when ever doInBackground() publishes progress so that you can keep your user updated in case of a long background process ex. update your progress bar percentage here

Hope this helps. You might also want to look at the documentation which might help you further to understand the full capabilities of Asynctask.

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

Vadim Kotov
  • 8,084
  • 8
  • 48
  • 62
qazimusab
  • 1,031
  • 1
  • 7
  • 14