2017-09-25 11 views
0

私は新しいアンドロイドの開発者で、最近問題があります。nullコンテキストでalertDialogを作成するとアプリケーションがクラッシュする

バックエンドasyncTaskが終了したときに、私はAlertDialogを表示する必要があります。ただし、長い時間asyncTaskの後にアクティビティがGC'dになる可能性があります。そのため、AlertDialogの入力パラメータはnullです。この問題を解決する回避策はありますか。

public static Dialog showDialog(
      Context ctx, int themeId, String title, String message, 
      int okStrId, android.content.DialogInterface.OnClickListener okListener, 
      int cancelStrId, android.content.DialogInterface.OnClickListener cancelListener) { 
     if (ctx != null) { 
      AlertDialog.Builder builder; 
      if (themeId > 0) 
       builder = new AlertDialog.Builder(new ContextThemeWrapper(ctx, themeId)); 
      else 
       builder = new AlertDialog.Builder(ctx); 
      if (title != null) 
       builder.setTitle(title); 
      builder.setMessage(message); 
      builder.setPositiveButton(ctx.getString((okStrId < 0) ? R.string.ok : okStrId), 
        (okListener != null) ? okListener : sDefaultDialogListener); 
      if (cancelListener != null) 
       builder.setNegativeButton(ctx.getString((cancelStrId < 0) ? R.string.cancel : cancelStrId), cancelListener); 
      else { 
       builder.setCancelable(false); 
      } 
      AlertDialog ad = builder.create(); 
      ad.show(); 
      return ad; 
     }else { 
      Context context = SuccessFactorsApp.getAppContext(); 
      DialogActivity.launchActivity(ctx,themeId,title,message,okStrId,okListener,cancelStrId,cancelListener); 
      return new AlertDialog.Builder(context).create(); 
     } 
    } 

私は、ダイアログをシミュレートするための活動を使用しようとしたが、DialogInterface.OnClickListenerに対処する方法はないことを確認:

私は、ダイアログを表示するには、この関数を使用します。

+0

あなたのLogCatを投稿してください! –

答えて

0

あなたのコードにこれを追加します。

if(!((Activity) context).isFinishing()) 
{ 
    //show dialog 
} 
+0

あなたの答えをありがとう。問題は、私はアクティビティがガベージコレクションされている場合でもダイアログを表示する必要があるということです。 – vincentFeng11

0

asyntaskを実行し、バックグラウンド活性を行うことは、タスクの完了時に死亡し、ごみcollected..Henceますしながら、あなたがactivity.Youせずにダイアログを表示することができないことは

のいずれかを試すことができますダイアログがCの次の行を追加見せながら

1.Byは

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> 

を明示するために、あなたのダイアログ.Addにこの権限を示す権限の下に追加し、タスクのdialog.show前頌歌()

alertDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT); 

2.Onのfinsihing代わりに、ダイアログの希望の活動とオープンなアプリケーション

3.Useトーストを起動します。

関連する問題