2012-04-07 39 views
0

私はインターネットからデータを取得しようとしています。それを解析し、そのデータをユーザーに表示します。アクションは通常3秒かかります。スピンナーProgressDialogにデータをロードしているというメッセージを表示します。問題は、ProgressDialogが読み込みがほぼ完了したときにのみ表示されることです。これは私のコードProgressDialogがすぐに表示されない

@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    Button load_routes = (Button)findViewById(R.id.load_routes); 

    load_routes.setOnClickListener(new View.OnClickListener() 
    { 
     public void onClick(View v) 
     { 
      task_complete = false; 
      progressBar = new ProgressDialog(v.getContext()); 
      progressBar.setCancelable(false); 
      progressBar.setMessage("Fetching routes data ..."); 
      progressBar.setProgressStyle(ProgressDialog.STYLE_SPINNER); 
      progressBar.show(); 

      if(haveNetworkConnection()) 
      { 
       loading_routes_data(v); 
      } 
      else 
      { 
       progressBar.dismiss(); 
      } 
     } 
    }); 
} 

そして、これが私のrefresh_routes()機能は、データを取得し、それを解析し、その後truetask_completeを設定し、私はかどうかにさえわからないのonclick

private void loading_routes_data(View v) 
{ 
    try 
    { 
     new Thread(new Runnable() 
     { 
      public void run() 
      { 
       while(!task_complete) 
       { 
        refresh_routes(); 
        try 
        { 
         Thread.sleep(1000); 
        } 
        catch(InterruptedException e) 
        { 
         e.printStackTrace(); 
        } 
       } 
       runOnUiThread(new Runnable() 
       { 
        public void run() 
        { 
         progressBar.dismiss(); 
        } 
       }); 
      } 
     }).start(); 
    } 
    catch(Exception e) 
    { 
    } 

    while(!task_complete) 
    { 
    } 
} 

呼び出される私の機能ですそれとも、私はそれをwhileループの中に入れておくべきですか?

これは私の大きな問題です。 ProgressDialogをボタンクリックですぐに表示したい場合は、refresh_routes()に電話して、refresh_routes()が完了したら、進捗ダイアログを削除したいと思います。しかし、私はそれをやり遂げる方法については不明です。

もし誰かが、私が本当に感謝してくれるような例をいくつかの記事で問題を解決する方法を私に示すことができた。事前にありがとう:)

答えて

2

メソッド終了時にwhile(!task_complete)を呼び出してUIスレッドをロックしています。このような操作には、実際にはAsyncTaskを使用する必要があります。ここにあなたのAsyncTaskがどのように見えるかです:あなたrefresh_routes()方法がどのように動作するか

new MyAsyncTask(this).execute(); 

私はわからないんだけど、あなたはそれが内部の機能です移動することを検討可能性があります

private class MyAsyncTask extends AsyncTask<Void, Void, Void> { 

    private ProgressDialog progressDialog; 
    private Context context; 

    public MyAsyncTask(Context context) { 

     this.context = context; 
    } 

    @Override 
    protected void onPreExecute() { 

     super.onPreExecute(); 
     progressDialog = ProgressDialog.show(context, null, "Fetching routes data ..."); 
    } 

    @Override 
    protected Void doInBackground(Void... params) { 

     while (!task_complete) { 
      refresh_routes(); 
      try { 
       Thread.sleep(1000); 
      } 
      catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 

     return null; 
    } 

    @Override 
    protected void onPostExecute(Void result) { 

     super.onPostExecute(result); 
     progressDialog.dismiss(); 
    } 
} 

はこれを実行するには、これを行うだろうdoInBackground()メソッド。

+0

素晴らしいです。オンラインのすべてのチュートリアルではスレッドを使用すると言われていましたが、これは素晴らしいことです。また、asynchからのパラメータとしてビューを受け入れる関数を呼び出すことができる方法があるかどうかを知っていますか? – Quillion

+0

バックグラウンドプロセスの実行中に進捗状況を表示する必要がある場合は、 'onProgressUpdate(...) 'メソッドをオーバーライドしてください。そしてアクションをトリガするために、 'doInBackground()'メソッドの中から 'publishProgress(...)'を呼び出すことができます。 UIスレッドで自動的に実行されます。すべてがどのように適合するかを理解するには、AsyncTaskのドキュメントを読んでください。 –

1

これを行うにはAsyncTaskを使用してください。これは、アクティビティでマルチスレッドを実行するための優れた機能を提供します。

関連する問題