External AsyncTask class with ProgressDialog [Update: and returning back?]

匿名 (未验证) 提交于 2019-12-03 01:23:02

问题:

**Updated: (See below)**I have been looking around for couple of days and can't find a straight answer to this. Some say it possible to some say to accomplish some say it's not. I am getting crazy on this.

What I want is just to have the AsyncTaskTask showing a progressbar an external class. To do this I am passing the context as you can see in the main class. But whatever I try I get NullPointerException.

Working code examples is appreciated. Thank you

Using Android 2.2 by the way.

main:

import android.app.Activity; import android.os.Bundle;  public class AsyncDemo extends Activity {      @Override     public void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         setContentView(R.layout.main);         new AsyncClass(this).execute();     } } 

AsyncClass.java

import android.app.ProgressDialog; import android.content.Context; import android.os.AsyncTask; import android.os.SystemClock;  public class AsyncClass extends AsyncTask {     private Context context;     ProgressDialog dialog = new ProgressDialog(context);      public AsyncClass(Context cxt) {         context = cxt;     }      @Override     protected void onPreExecute() {         dialog.setTitle("Please wait");         dialog.show();     }      @Override     protected Void doInBackground(Void... unused) {         SystemClock.sleep(2000);         return (null);     }      @Override     protected void onPostExecute(Void unused) {         dialog.dismiss();     } } 

Update: I have a follow up question: Using the above code, is it possible to return a value from the onPostExecute method back to the main class, somehow? (Sorry about beeing noobish) I have tried something like this:

String result = new AsyncClass(this).execute(); 

and then a method that return back a string. But I can't do that because i got:

Type mismatch: cannot convert from AsyncTask to String 

What can I do to tackle this problem? Thanks.

回答1:

You were creating the ProgressDialog with a null context. The following code worked for me.

public class AsyncClass extends AsyncTask {     private Context context;     ProgressDialog dialog;          public AsyncClass(Context cxt) {             context = cxt;             dialog = new ProgressDialog(context);         }          @Override         protected void onPreExecute() {             dialog.setTitle("Please wait");             dialog.show();         }          @Override         protected Void doInBackground(Void... unused) {             SystemClock.sleep(2000);             return (null);         }          @Override         protected void onPostExecute(Void unused) {             dialog.dismiss();         }     } 


回答2:

ok this is what I did as i was using fragments. This is how you call the AsyncTask inside a fragment:

String result=new AsyncClass(getActivity()).execute(); 

and this is how my AsyncTask outer class looks like:

public class AsyncClass extends AsyncTask {      ProgressDialog pdialog;      public AsyncClass(Context context) {         pdialog = new ProgressDialog(context);     }      @Override     protected void onPreExecute() {         pdialog.setIndeterminate(true);         pdialog.setCancelable(false);         pdialog.setTitle("Loading Feed..");         pdialog.setMessage("Please wait.");pdialog.show();     }      @Override     protected String doInBackground(Void... params) {         String result=null;         //do your task here and generate result String         return result;     }      @Override     protected void onPostExecute(String result) {         if(pdialog.isShowing())              pdialog.dismiss();     } } 

@SSZero thanks great answer, helped a lot.



回答3:

I would like to answer that follow up question i.e.

I have a follow up question: Using the above code, is it possible to return a value from the onPostExecute method back to the main class, somehow? (Sorry about beeing noobish) I have tried something like this:

String result = new AsyncClass(this).execute();

I did this in my code it worked.

AsyncClass ac=new AsyncClass();  ac.execute("");  String rslt=ac.get(); 

Call this code wherever you want to.

public class AsynchClass extends AsyncTask  {      public String result=null;       @Override     protected void onPreExecute() {     // TODO Auto-generated method stub        }      protected String doInBackground(String... params)      {              // Do all your background task here              return result;      }     @Override      protected void onProgressUpdate(Integer... values) {       }      protected void onPostExecute(String result) {      } } 


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!