The title is clearly. When I launch AsyncTask my app crash. Exactly the problem is in the ProgressDialog's show method.
I launch my AsncTask from a Fragment (onCreate method).
@Override
public void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
context = getActivity().getBaseContext();
LoadLastNewAsync llna = new LoadLastNewAsync(context, lang);
try {
tituloAviso = llna.execute().get();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
This is mi AsyncTask code:
public class LoadLastNewAsync extends AsyncTask <Void, Void, String>{
Context context;
private DataBaseHelper myDbHelper;
private String tituloAviso;
private Aviso aviso;
private String lang;
private ProgressDialog pDialog;
//constructor
public LoadLastNewAsync(Context context, String lang) {
//mActivity = activity;
this.context = context;
this.lang = lang;
}
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
super.onPreExecute();
pDialog = new ProgressDialog(context);
pDialog.setMessage("Loading...");
pDialog.setCancelable(false);//erabiltzaileak atzera botoia sakatuz ez kantzelatzeko
pDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);//barrarewn estiloa. Espiral bat izango da
pDialog.show();
}
@Override
protected void onProgressUpdate(Void... values) {
// TODO Auto-generated method stub
super.onProgressUpdate(values);
}
@Override
protected String doInBackground(Void... params) {
// TODO Auto-generated method stub
Log.i("Testing", "LoadLastNewAsync. Entra en doInBackGround");
myDbHelper = new DataBaseHelper(context);
boolean dbExist = myDbHelper.checkDataBase();
if(dbExist){
aviso = new Aviso();
aviso = recuperarUltimoAviso();
tituloAviso = aviso.getTitle();
}
return tituloAviso;
}
private Aviso recuperarUltimoAviso() {
// TODO Auto-generated method stub
try {
myDbHelper.openDataBase();
aviso = myDbHelper.getUltimoAviso(this.lang);
} catch (Exception e) {
// TODO: handle exception
}
myDbHelper.close();
return aviso;
}
@Override
protected void onPostExecute(String result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
pDialog.dismiss();
}
}
I receive this log:
FATAL EXCEPTION: main
Process: com.kirolm.instalacionesdep, PID: 29441
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.kirolm.instalacionesdep/com.kirolm.instalacionesdep.Main}: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2212)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2271)
at android.app.ActivityThread.access$800(ActivityThread.java:144)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1205)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5146)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:732)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:566)
at dalvik.system.NativeStart.main(Native Method)
Caused by: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
at android.view.ViewRootImpl.setView(ViewRootImpl.java:536)
at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:259)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69)
at android.app.Dialog.show(Dialog.java:286)
at com.kirolm.instalacionesdep.asynctask.LoadLastNewAsync.onPreExecute(LoadLastNewAsync.java:41)
at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:587)
at android.os.AsyncTask.execute(AsyncTask.java:535)
at com.kirolm.instalacionesdep.HomeFragment.onCreate(HomeFragment.java:71)
at android.app.Fragment.performCreate(Fragment.java:1678)
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:859)
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1062)
at android.app.BackStackRecord.run(BackStackRecord.java:684)
at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1447)
at android.app.Activity.performStart(Activity.java:5240)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2178)
I don't know where is the problem. It is maybe in the context? of the problem is in the Fragment cycle live?
ProgressDialog
needs the activity context for the displaying it.Try to replace theAsyncTask
declaration as