1

私はこのコード行を持っています:

1)    m_ProgressDialog = ProgressDialog.show(m_Context, "", m_Context.getString(R.string.dictionary_loading));
2)   //important code stuff: interact with db, change some textview values (= 2-3 seconds if i'm unlucky)
3)   m_ProgressDialog.dismiss();

しかし、何が起こるかというと、フェーズ2)は1)の前に発生します。これは間違っています。最初のUIがフリーズし、ダイアログが表示されます。

フェーズ2)は、DBと対話するコードであり、textViewsも変更される可能性があります。ただし、時間がかかる可能性があるため、ユーザーが本当に重要なことが行われていることを認識できるように、進行状況ダイアログを表示することにしました。UIコードとdbコードが混ざり合っているため、これらの操作にAsyncを使用できません。これは、私の人生を複雑にするだけです。

リクエストに応じてダイアログを強制的に表示するにはどうすればよいですか??..提示されたコードは、「空き時間があるときに今は時間がないときにToDoリスト」スタックに追加するだけです。

4

3 に答える 3

1

あなたはUIスレッドであなたの仕事をしています。UI(プログレスバー)の応答性を維持するには、これに別のスレッドを使用する必要があります。AsynchTaskを見てください。

于 2012-08-02T07:28:40.960 に答える
0

UiThreadをバックグラウンド操作に使用しないでください。画面がフリーズします。AsycTaskのような別のスレッドを使用する必要があります。

以下のようにしてください

onCreate()
{
dialog.show();
new DownloadFilesTask().excute()
}
class DownloadFilesTask extends AsyncTask<Void,Void,Void>
{
 protected Long doInBackground(URL... urls) {
        //Background operation
         }
         return null;
     }

     protected void onProgressUpdate(Integer... progress) {

     }

     protected void onPostExecute(Long result) {
      runOnUiThread(new Runnable() {

                @Override
                public void run() {
                    // TODO Auto-generated method stub
                    //Update you Ui here
dialog.dismiss();
                }
            });
     }
}
于 2012-08-02T07:37:14.313 に答える
0

ほとんどの場合、2つのメソッド、ShowLoading()とHideLoading()が必要な場合は、これを使用してください。

public static void ShowLoading()
{
   HideLoading();
    
   myLoadingThread = new Thread(new ThreadStart(LoadingThread));
   myLoadingThread.Start();
}

private static void LoadingThread()
{
   Looper.Prepare();
    
   myProgressDialog = new ProgressDialog(myActivity, 
      Resource.Style.AppTheme_Dialog);
                
   myProgressDialog.SetMessage("Loading..."); // Or a @string...

   myProgressDialog.SetIcon(Resource.Drawable.your_loading_icon);
                
   myProgressDialog.SetProgressStyle(ProgressDialogStyle.Spinner);
   myProgressDialog.SetCancelable(false);
   myProgressDialog.Show();
    
   Looper.Loop();
}
    
public static void HideLoading()
{
   if (myProgressDialog != null)
   {
      myProgressDialog.Dismiss();
      myProgressDialog = null;
   }
    
   if (myLoadingThread != null)
      myLoadingThread.Abort();
}

ここで、コードサンプルで使用した次の変数を宣言して説明します。そのうちの1つはグローバルです。グローバル変数を使用したくない場合、または一度に2つの読み込みダイアログが必要な場合(wtf .. .. )別の解決策を探します。これは最も単純な方法であり、最もフレンドリーで、ネストされたメソッド、新しいクラス、およびそのような単純なもののためのあらゆる場所での継承を備えた奇妙なコードがありません。

private Thread myLoadingThread;
private ProgressDialog myProgressDialog;

// Some people will hate me for this, but just remember
// to call myActivity = this; on each OnStart() of your app
// and end with all your headaches 
public Activity myActivity;  
于 2021-07-06T09:37:14.640 に答える