可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
**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) { } }