2012-03-06 23 views
0

待っているダイアログを表示したいのですが、何も表示されません。何度も時間がかかるのはsetData()関数でjson私はデータベースに保存します(3/5秒かかる)。ここで Androidが待っているダイアログがまったく表示されない

が私のコードです:私は、問題は、あなたがUIスレッド上でこの作品のすべてをやっているという事実である賭ける

ProgressDialog dialog = ProgressDialog.show(TabLayoutActivity.this, "", "Loading. Please wait...", true); 

    //refresh the view 
    taskLiteApplication.setData(); 

    //change view 
    Intent myIntent = new Intent(TabLayoutActivity.this, TabLayoutActivity.class); 
    TabLayoutActivity.this.startActivity(myIntent); 

    //kill the dialog waiting 
    dialog.cancel(); 

答えて

2

、その瞬間は、ダイアログ、起動するスレッドを開始し、 setData()の作業中にウィンドウが実際にフリーズしていることを示します。バックグラウンドで重い作業をしている間、UIスレッドが続行できるように、実際にはsetData関数をバックグラウンドスレッドまたはAsyncTaskに移動する必要があります。

private ProgressDialog dialog; 

void doStuff() 
{ 
    dialog = ProgressDialog.show(TabLayoutActivity.this, "", "Loading. Please wait...", true); 
    HeavyTask task = new HeavyTask(); 
    task.execute(); 
} 

private class HeavyTask extends AsyncTask<Void, Void, Void> { 
    protected Void doInBackground(Void... args) { 
     //refresh the view 
     taskLiteApplication.setData(); 
     return; 
    } 

    protected void onPostExecute(Void results) { 
     //change view 
     Intent myIntent = new Intent(TabLayoutActivity.this, TabLayoutActivity.class); 
     TabLayoutActivity.this.startActivity(myIntent); 

     //kill the dialog waiting 
     dialog.dismiss(); 
     dialog = null; 
    } 
} 
+0

にはい、それは私が前にダイアログを起動すると、罰金だろうと考えていたことを、おそらくですが、はい、 –

+0

私はasynctaskでこれをやろうよそれから私はよ –

+0

働いて、あなたはちょうどdoInBackground関数の戻り値を逃した、ありがとう! –

0

私はtaskLiteApplication.setData()を推測しています。バックグラウンドスレッドではなくUIスレッドで動作しているか、またはバックグラウンドスレッドで動作しています。キャンセルはUIスレッドでキャンセルされているため呼び出されています。ダイアログが

この利点は、あなたがあるUIスレッドでキャンセルする必要がハンドラを追加しました

private ProgressDialog dialog; // Keep this global 
private Handler mHandler; 

void doStuff() { 
    dialog = ProgressDialog.show(TabLayoutActivity.this, "", "Loading. Please wait...", true); 
    mHandler = new Handler() 
    { 
     @Override public void handleMessage(Message msg) { 
      if (msg.obj != null) { 
       dialog.dismiss(); 
       //change view 
       Intent myIntent = new Intent(TabLayoutActivity.this, TabLayoutActivity.class); 
       TabLayoutActivity.this.startActivity(myIntent); 
      } 
     } 
    }; 
    //refresh the view 
    Thread t = new Thread(new Runnable() { 
     @Override public void run() { 
      // Assuming setData does NOT run on it's own background thread 
      taskLiteApplication.setData(); 
      Message message = Message.obtain(); 
      message.obj = "DONERAEREAR"; 
      mHandler.sendMessage(message); 
     } 
    })}; 
    t.start(); 
} 

EDIT、Wizetuxで指摘したように:

基本的なスレッドはあなたの問題を解決するにはハンドラのエラーメッセージ、警告メッセージ、成功メッセージを送信し、それに従って処理することができます。

E.G.

message.obj = "ERROR"; 
mHandler.sendMessage(message); 

は、ハンドラ

if ((String)msg.obj.equals("ERROR")) { /* Handle Error */ } 
+0

dialog.cancelをバックグラウンドスレッドから呼び出すことはできません。これはUIスレッドから行う必要があります。これはそのまま動作しません。 – Wizetux

+0

ハンドラーで編集 – bbedward

関連する問題