在第一个 运行 之后,ProgressDialog 在片段中崩溃

ProgressDialog crash in fragment after first run

首先我不得不说我已经阅读了一些关于这个问题的帖子,但没有人解决我的问题。

在应用程序的第一个 运行 上,启动了一个简介 activity 以请求一些数据:

public class MainActivity extends AppCompatActivity{
    ...
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        ...

        //If first run, an intro is shown
        if (!isIntroShown()) {
            Intent intent = new Intent(MainActivity.this, IntroWellcomeActivity.class);
            startActivity(intent);
            setIntroShown(true);
            finish();
        }

        //Navigation drawer set up
        drawerLayout.setDrawerListener(this);

        setUpToolbar();
        setUpNavDrawer();

        displayFragment(R.id.navigation_item_1);

        navView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
            @Override public boolean onNavigationItemSelected(MenuItem menuItem) {
                menuItem.setChecked(true);
                displayFragment(menuItem.getItemId());
                drawerLayout.closeDrawers();
                return true;
            }
        });

当它 returns 在介绍之后,导航抽屉第一次显示为文档状态并加载默认片段。

此片段显示介绍中介绍的信息,例如 phone 号码。在此片段中,我可以根据需要更改此数字。如果我这样做,我会在后台作业完成时显示一个进度对话框。

但是问题来了。在第一个 运行 上,我不太明白为什么会这样,但是当应该显示 Progress 对话框时,应用程序崩溃并在 logCat.

上显示这个
E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.myapp, PID: 31388
    android.view.WindowManager$BadTokenException: Unable to add window -- token android.os.BinderProxy@55b185f is not valid; is your activity running?

在此之后,我再次 运行 应用程序。这次没有显示介绍,也没有显示导航抽屉(这只发生在第一个 运行 上),如果我再次尝试编辑 phone 编号,则会显示进度对话框并且一切正常.

这就是我在片段中启动 ProgressDialog 的方式:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.fragment_profile, container, false);
    ...
    progressDialog = new ProgressDialog(getContext());

我试过使用 getActivity() 而不是 getContext(),但没有解决问题。

所以我猜想在第一个 运行 显示简介并加载片段后,某些内容未启动,或者我在错误的位置启动了 progressDialog。我不知道。

我认为您在 activity 中创建了一个片段,然后在显示对话框之前对其调用了 finish()。尽量不要在 if (!isIntroShown()) 语句中调用 finish()

从 intro/tutorial 您可以 return 到稍后创建的相同 activity 而无需首先杀死它。

当您为不再存在的上下文显示对话框时可能会发生这种情况,因此何时尝试初始化您的 ProgressDialog 检查 Activity 是否为 运行。

if(!((Activity) getActivity()).isFinishing()){
     progressDialog = new ProgressDialog(getActivity());
}