我有一个具有“登录”按钮的活动,“登录”按钮具有asynctask,并且在任务开始之前应显示正在加载的AlertDialog,然后关闭对话框并在完成时退出到另一个活动。

我需要它来处理方向更改,但是如果方向发生在线程运行时,则片段会被破坏,并且在onPostExecute()中调用DialogFragment.dismiss会给我一个空指针异常。我该怎么办?

在执行前

FragmentManager fm = getFragmentManager();
TestDiag alertFrag = new TestDiag();
alertFrag.show(fm, "Alert_Dialog");


在PostExecute()上

FragmentManager fm = getFragmentManager();
TestDiag alertFrag2= (TestDiag) fm.findFragmentByTag("Alert_Dialog");
alertFrag2.dismiss();


编辑:我已经尝试过在保留实例true上设置,它可以工作,但是也不起作用。

最佳答案

我只是锁定方向,直到我的AsyncTask完成,onPreExecute()->锁定和onPostExecute()->释放。

public class Device {

public static void lockOrientation(Activity activity) {
    Display display = ((WindowManager) activity.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
    int rotation = display.getRotation();
    int tempOrientation = activity.getResources().getConfiguration().orientation;
    int orientation = 0;
    switch(tempOrientation)
    {
    case Configuration.ORIENTATION_LANDSCAPE:
        if(rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_90)
            orientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
        else
            orientation = ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE;
        break;
    case Configuration.ORIENTATION_PORTRAIT:
        if(rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_270)
            orientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
        else
            orientation = ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT;
    }
    activity.setRequestedOrientation(orientation);
}





public static void releaseOrientation(Activity activity) {
    activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
}


}

如果您确实要在任务运行时允许更改方向:Using AsyncTask with progress dialogs and device rotation.

09-10 08:29
查看更多