私は1つがActivity
、Fragment
がたくさんあります。私はこれらのフラグメントをhide
& show
で切り替えました。初めてのことは大丈夫ですが、アプリを終了してアプリを再起動したときにクラッシュしました。ここAndroid Fragment show ProgressDialogクラッシュ
は例外メッセージである:
[ 05-10 10:47:12.561 15134:15134 E/ ]
android.view.WindowManager$BadTokenException: Unable to add window -- token [email protected] is not valid; is your activity running?
at android.view.ViewRootImpl.setView(ViewRootImpl.java:606)
at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:311)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:85)
at android.app.Dialog.show(Dialog.java:325)
at ruiming.com.medicalmanagement.view.MainActivity.showProgressDialog(MainActivity.java:447)
at ruiming.com.medicalmanagement.view.PatientsCases.loadList(PatientsCases.java:106)
at ruiming.com.medicalmanagement.view.PatientsCases.onViewCreated(PatientsCases.java:92)
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:908)
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1069)
at android.app.BackStackRecord.run(BackStackRecord.java:834)
at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1454)
at android.app.FragmentManagerImpl$1.run(FragmentManager.java:447)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5689)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:960)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)
これはprogressDialog
のshow
hide
と関数である:
private static ProgressDialog progressDialog;
public static void showProgressDialog(Activity mActivity) {
if(progressDialog == null){
progressDialog = ProgressDialog.show(mActivity, "Please wait", "Loading...", true, false);
}
if(!mActivity.isFinishing() && !progressDialog.isShowing()){
progressDialog.show();
}
}
public static void hideProgressDialog() {
if (progressDialog != null && progressDialog.isShowing()) {
progressDialog.dismiss();
}
}
これらの機能は、活性がありました。
これは私のフラグメントのコードです:私は私のコードが悪いのか分からない
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
MainActivity.showProgressDialog(getActivity());
new Thread(new Runnable() {
@Override
public void run() {
mList = MyJDBCUtil.getPrAcupuntrueCode(getActivity());
try {
Thread.sleep(500);
EventBus.getDefault().post(new EventBean.PrDiagonsisEvent("3"));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}
@Subscribe(threadMode = ThreadMode.MAIN, priority = 0, sticky = false)
public void refreshList(EventBean.PrDiagonsisEvent pr) {
if (pr.getMsg().equals("3")) {
adapter = new TreatmentAdapter(getActivity());
lvTreatmentList.setAdapter(adapter);
MainActivity.hideProgressDialog();
}
}
。任意の提案をしてください、あなたのshowProgressDialog()
あなたが呼んでいるで
あなたの全体のlogcatを投稿することができますようにコードを修正しますか? hideProgressDialogメソッドでエラーが発生した場合、アクティビティが表示されなくなった後にrefreshListメソッドが呼び出されている可能性があります。また、すべてのウィンドウクラスの静的参照を保持しないでください。ProgressDialogにはアクティビティへの参照が含まれているため、大きなメモリリークが発生しています。 – jonathanrz
@jonathanrz私はlogcat全体を投稿します。このエラーは、showProgressDialogで発生します。エラーの場所はprogressDialog.show()です。私は参照で何が起こるか理解していない。いくつか提案していただけますか? –