当我执行 ProgressDialog.show() 方法时,AsyncTask 杀死了我的应用程序

AsyncTask kills my app when I execute ProgressDialog.show() method

标题很清楚。当我启动 AsyncTask 时,我的应用程序崩溃了。问题出在 ProgressDialog 的 show 方法中。

我从片段(onCreate 方法)启动我的 AsncTask。

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

这是 mi AsyncTask 代码:

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

我收到此日志:

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.access0(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)

不知道哪里出了问题。也许在上下文中?问题出在 Fragment 循环直播中?

ProgressDialog 需要 activity 上下文来显示 it.Try 以将 AsyncTask 声明替换为

 LoadLastNewAsync llna = new LoadLastNewAsync(getActivity(), lang);

您无法通过非 Activity 的上下文显示应用程序 window/dialog。尝试传递有效的 activity 引用。

使用当前 activity 上下文而不是基本上下文 MyActivity.this 作为上下文 在通过构造函数传递它之前

在异步任务的 onPost 中也使用进度对话框作为

try{
    if (pWindow != null) {
       pWindow.dismiss();
    } 
} catch (IllegalStateException ise) {
        ise.printStackTrace();
}

您的 onPreExecute 方法有问题。试试这个,它对我有用。 替换

pDialog = new ProgressDialog(context);

pDialog = new ProgressDialog(getDialogContext());

将 getDialogContext() 方法定义为:

private Context getDialogContext()
{
    Context context;
    if (getParent() != null)
        context = getParent();
    else
        context = this;
    return context;
}