1

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

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

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

  1. активность "а" (с ProgressBar)
                2. "а" .onOptionsItemSelected(): Spawn Сервис "б"
                                  3. «b» .onCreate(): контролировать ProgressBar в «a» // h ERE, где у меня есть моя беда

Разметка для бара Прогресс (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" 
    /> 

"а" .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; 
} 

"б" .onCreate () (3):

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

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

Что я ищу - это способ для активности общения с порожденным сервером. – montooner

ответ

0

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

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

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

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

0

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

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

Хорошие места для начала - here и here.

Смежные вопросы