1

ファイル スキャナ アプリケーションでプログレス バー ビューを動作させようとしてきましたが、アクティビティ、サービス、スレッド、およびハンドラの適切な組み合わせに完全に困惑しています。

構造は次のとおりです。My Activity には、水平スタイルの ProgressBar が含まれています。メニュー項目をクリックすると、進行状況バーを更新できるようにしたい onCreate() サービスを生成します。

私の質問:何が欠けていますか?

  1. Activity "a" (with ProgressBar)
          2. "a".onOptionsItemSelected(): Spawn Service "b"
                   3. "b".onCreate(): Control the ProgressBar in "a" // ここで問題が発生します

プログレスバーのレイアウト (1):

<ProgressBar 
    style="?android:attr/progressBarStyleHorizontal"
    android:layout_height="wrap_content"
    android:max="100"
    android:progress="0"
    android:secondaryProgress="0" 
    android:layout_width="300px" 
    android:layout_marginLeft="10px" 
    android:id="@+id/progress_horizontal"
    />

"a".onOptionsItemSelected (2):

public boolean onOptionsItemSelected(MenuItem item) 
{
            if (svc == null)
            {
                android.util.Log.v("@@@@@@@@@@@@@@@@@@@@@", "starting");
                svc = new Intent(this, DoScan.class);
                // done in "a".onCreate()
                            // hmap = new HashMap();
                    // hmap.put("tv", tv);
                svc.putExtra("hmap", hmap);
                startService(svc);
            }
            break;
}

"b".onCreate() (3):

@Override
public void onCreate() {
    super.onCreate();

    //startThread();
    TextView tv = (TextView) Peekaboo.hmap.get("tv");
    tv.append("cocktail");
}
4

2 に答える 2

0

率直に言うと、あなたのサービスonCreate()は...問題があります:

  1. ウィジェットをサービスに渡そうとしないでください
  2. サービスからウィジェットを変更しようとしないでください
  3. 進行状況バーを操作するときは、バックグラウンド スレッドを使用してみてください

1 と 2 に関しては、ユーザーが画面を回転させた場合 (たとえば、G1 のキーボードをスライドさせた場合)、サービスが保持しているウィジェットが無効になるとどうなるかを自問してください。

#3 に関しては、ローカル サービスを開始しても、バックグラウンド スレッドは自動的に作成されません。サービスは、アクティビティおよび他のすべてのアクティビティと同じスレッドで実行されます。バックグラウンド スレッドで作業を実行する場合は、スレッドを使用AsyncTaskまたは作成し、ハンドラー orpost()またはpostDelayed()orを使用runOnUiThread()して、バックグラウンド スレッドが UI スレッドで UI 更新が発生するように調整します。

于 2009-07-29T23:16:17.117 に答える
0

特別なことを何もしなくても、プログラムは 1 つのスレッド、UI スレッド、OS の UI スレッドで実行されます。プログラムで行われた処理は、実行する別のスレッドを作成しない限り、UI スレッドで実行されます。そのスレッドは、タスクの進行状況を UI スレッドに伝える必要があります (Runnable、Handler、および Thread クラスを使用します)。次に、メインの UI スレッドが、ProgressBar でユーザーに表示される内容を更新します。

この最善の方法は、1 時間かけて SDK スレッドの例を確認することです。

開始するのに適した場所は、ここここです。

于 2009-07-29T23:51:49.967 に答える