Android 4.0 を対象としており、TCP/IP を使用してテレメトリ デバイスと通信しています。Android 4.0 では、すべてのネットワーキングを別のスレッドで行う必要があります。最初にソケットを開き、次にデバイスに接続して、別のスレッドからすべての情報をダウンロードします。この時点で、進行状況ダイアログを表示して、より詳細な情報のダウンロードの進行状況を表示したいと考えています。私の問題は、メイン UI 以外のどこからでも進行状況ダイアログを表示できないことです。しかし、進行状況ダイアログを表示する準備ができている別のスレッドのポイントにいつ到達したかはわかりません。システムを拘束せずにメイン UI からこれを確認する方法はありますか?
3 に答える
そのようにハンドラを使用します:
final int PROGRESS_BY = 1;
final Handler handler = new Handler()
{
public void handleMessage(android.os.Message msg)
{
switch (msg.what)
{
case PROGRESS_BY :
progressBar.setProgress((Integer) msg.obj);
break;
}
}
};
Thread thread = new Thread()
{
@Override
public void run()
{
super.run();
// do something
Message msg = new Message();
msg.what = PROGRESS_BY;
msg.obj = new Integer(10);
handler.sendMessage(msg);
// do something
[...]
}
};
AsyncTask
あなたが説明するような場合を対象としたフレームワーク提供のユーティリティです。他のスレッド、つまり非同期タスクが実行されているスレッドから、publishProgress
AsyncTask の () メソッドを使用して進行状況を公開できます。非同期で別のスレッドで実行されますが、メイン スレッドで実行されるイベント コールバックがあります。OnProgressUpdate
() は、進行状況ダイアログを操作できる方法です。
http://developer.android.com/reference/android/os/AsyncTask.html
メイン UI でダイアログをトリガーするには、'context.runOnUiThread()' を使用する必要があります。ここで、context は表示アクティビティへの参照です。AsyncTask の使用も検討する価値があります。
すべてを詳細に説明する Android のブログ投稿は次のとおりです: http://android-developers.blogspot.ca/2009/05/painless-threading.html
余談ですが、最初から不確定な進行状況ダイアログの表示を開始することもできます。これにより、ユーザーは視覚的なフィードバックなしで待機することがなくなり、ダウンロードの詳細がわかったら確定に切り替えることができます。