Обновить интегрированный индикатор выполнения в исходном действии - PullRequest
1 голос
/ 30 июля 2009

Я пытался заставить мое представление индикатора выполнения работать в моем приложении для сканирования файлов, и я полностью озадачен правильной комбинацией действий, служб, потоков и обработчиков.

Вот структура: Моя активность содержит ProgressBar в горизонтальном стиле. При щелчке по пункту меню я вызываю Сервис, который, onCreate (), где я хочу иметь возможность обновлять индикатор выполнения.

Мой вопрос: что мне не хватает?

  1. Упражнение «а» (с ProgressBar)
    2. "a" .onOptionsItemSelected (): служба порождения "b"
    3. «b» .onCreate (): управление ProgressBar в «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");
}

Ответы [ 2 ]

0 голосов
/ 30 июля 2009

Не делая ничего особенного, ваша программа работает в одном потоке, потоке пользовательского интерфейса, потоке пользовательского интерфейса ОС. Все, что сделано в вашей программе, выполняется в потоке пользовательского интерфейса, если вы не создадите другой поток для его выполнения. Этот поток должен сообщить о ходе выполнения задачи обратно в поток пользовательского интерфейса (используйте классы Runnable, Handler и Thread). Затем основной поток пользовательского интерфейса обновляет то, что видит пользователь на панели ProgressBar.

Это лучшее, что нужно сделать, это потратить час и разобраться с примерами потоков SDK.

Хорошие места для начала: здесь и здесь .

0 голосов
/ 30 июля 2009

Если говорить прямо, у вашей службы onCreate() есть ... проблемы:

  1. Не пытайтесь передавать виджеты в службу
  2. Не пытайтесь изменять виджеты из службы
  3. Старайтесь использовать фоновые потоки при работе с индикаторами выполнения

С точки зрения № 1 и № 2, спросите себя, что произойдет, когда пользователь поворачивает экран (например, выдвигает клавиатуру G1), и виджеты, удерживаемые службой, становятся недействительными.

С точки зрения # 3, запуск локальной службы не создает автоматически фоновый поток. Служба будет работать в том же потоке, что и действие и все остальные действия. Если вы хотите, чтобы работа выполнялась в фоновом потоке, используйте AsyncTask или создайте поток и используйте обработчик или post() или postDelayed() или runOnUiThread(), чтобы фоновый поток организовывал обновления пользовательского интерфейса в пользовательском интерфейсе нить.

...