私はインターネットからデータを取得しようとしています。それを解析し、そのデータをユーザーに表示します。アクションは通常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()
機能は、データを取得し、それを解析し、その後true
にtask_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()
が完了したら、進捗ダイアログを削除したいと思います。しかし、私はそれをやり遂げる方法については不明です。
もし誰かが、私が本当に感謝してくれるような例をいくつかの記事で問題を解決する方法を私に示すことができた。事前にありがとう:)
素晴らしいです。オンラインのすべてのチュートリアルではスレッドを使用すると言われていましたが、これは素晴らしいことです。また、asynchからのパラメータとしてビューを受け入れる関数を呼び出すことができる方法があるかどうかを知っていますか? – Quillion
バックグラウンドプロセスの実行中に進捗状況を表示する必要がある場合は、 'onProgressUpdate(...) 'メソッドをオーバーライドしてください。そしてアクションをトリガするために、 'doInBackground()'メソッドの中から 'publishProgress(...)'を呼び出すことができます。 UIスレッドで自動的に実行されます。すべてがどのように適合するかを理解するには、AsyncTaskのドキュメントを読んでください。 –