2016-07-19 6 views
-1

私はBaseクラスとChildクラス構造のAndroidプロジェクトを持っています。基本的に、基本クラスのほとんどのメソッドは子アクティビティで利用できます。例外を表示しているポップアップがアクティビティが開始されました

ここでは、すべての子アクティビティで同じように使用できるように、カスタム読み込みタイプのpopupwindow whoesメソッド本体が基本クラスに作成されました。

これで、onCreateステージの子アクティビティでinitloaderを呼び出すときに、アクティビティが開始されたという例外が発生しました。

私は少しをGoogleで検索して、この手順を見つけました:

new Handler().post(new Runnable() { 
       @Override 
       public void run() { 
        cDialog.show(); 
       } 
      }); 

onloadfinishsedは、私は再びpopupwindowを閉じる発生したとき、私は、ポップアップショーを働いていた..しかし、

後。

public void hideCustomDialog() { 
    runOnUiThread(new Runnable() { 
     @Override 
     public void run() { 
      if (cDialog != null && cDialog.isShowing()) 
       cDialog.dismiss(); 
     } 
    }); 
} 

これは問題なく動作しますが、ローダーを呼び出していくつかのデータを取得し、その終了がかなり速いと言えます。その時点では、cDialog.show()からヒントを読み込んでいます。依然としてハンドラポストキューを待っています。

その結果、無限のダイアログが表示されます。

アイデアを回避する方法はありますか?

+0

エラーは何ですか? stacktraceを共有する –

+0

エラーはありません。showloaderの前にhideloaderを呼び出すだけで、ポップアップが実際に閉じることはありません。 – Ari

答えて

0

cDialog.show();を実行する前にダイアログがhideCustomDialog()で実行されたかどうかを知るフラグを作成できます。例:

があなたのローダーを実行する前にフラグをfalseに初期化します。

boolean wasDialogClosed = false; 

チェック済みデータをフェッチ終了した場合:trueに

new Handler().post(new Runnable() { 
       @Override 
       public void run() { 
        if(!wasDialogClosed){ 
         cDialog.show(); 
        } 
       } 
      }); 

設定フラグを、それを示す前に、ダイアログを閉じてしようとした場合:

public void hideCustomDialog() { 
    runOnUiThread(new Runnable() { 
     @Override 
     public void run() { 
      if (cDialog != null && cDialog.isShowing()){ 
       cDialog.dismiss(); 
      } 
      else{ 
       wasDialogClosed = true; 
      } 
     } 
    }); 
} 

EDIT 1

あなたがた場合に、ダイアログを閉じるために、プロセスを遅らせるために試みることができるが、それは、完璧なシナリオではありませんが既に作成されていません。

public void hideCustomDialog() { 
    runOnUiThread(new Runnable() { 
     @Override 
     public void run() { 
      if (cDialog != null && cDialog.isShowing()){ 
       cDialog.dismiss(); 
      } 
      else{ 
       Handler mHandler = new Handler(); 
       //Close the dialog after one sec 
       mHandler.postDelayed(new Runnable() { 
        @Override 
        public void run() { 
         runOnUiThread(new Runnable() { 
          public void run() { 

           cDialog.dismiss(); 

          } 

         }); 
        } 
       }, 1000); 
      } 
     } 
    }); 
} 
+0

メソッドがベースアクティビティにあるので、このプロシージャを回避しようとしています。 。他のすべての回避策? – Ari

+0

Naa、カスタムロードポップアップはすべての可能な条件に関連しているので、1秒の遅れでそれを危険にさらすことはできません。とにかくありがとう、私は旗の事に行く必要があるかもしれません。 – Ari

-1

あなたが同様の作業を行うためにAsyncTaskを使用することができます。 onPreExecuteでダイアログを読み込み、onPostExecuteで閉じます。

private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> { 
protected Long doInBackground(URL... urls) { 
    //Your Code 
} 
protected void onPreExecute() { 
     cDialog.show(); 
    } 
protected void onPostExecute(Long result) { 
    if (cDialog != null && cDialog.isShowing()){ 
      cDialog.dismiss(); 
} 

}

+0

いいえ、私はすでにローダーを使用しています。私はAsynctaskをさらに使用する必要はありません。 – Ari

関連する問題