2014-01-04 4 views
1

Я работаю над расширением приложения android, реализующим Runnable.Android - функция Runnable run() не работает

Проблема заключается в том, что функция run() не запускается, и я не уверен, что если запуск Runnable запустится автоматически как AsyncTask?

Вот мой код

public class MainActivity extends FragmentActivity implements 
     ActionBar.TabListener, Runnable { 

     ... 

     @Override 
     public void run() { 
     // mediaPlayer is myMediaPlayer 
     // progress is my SeekBar 
     Log.w("Tunesto", "testabababab"); 
     int currentPosition = 0; 
     int total = mediaPlayer.getDuration(); 
     progress.setMax(total); 
     while (mediaPlayer != null && currentPosition < total) { 
      try { 
       Thread.sleep(1000); 
       currentPosition = mediaPlayer.getCurrentPosition(); 
      } catch (InterruptedException e) { 
       return; 
      } catch (Exception e) { 
       return; 
      } 
      progress.setProgress(currentPosition); 
      Log.w("MyApp", String.valueOf(currentPosition)); 
     } 
     } 
} 

Очевидно, что если я запускаю Бегите сюда, интерфейс Thread заморозит экран из метода сна, так как я должен сделать, чтобы метод Run для запуска?

Спасибо!

+0

Ваша деятельность реализует Runnable? Довольно уверен, что я никогда раньше этого не видел. –

ответ

3

Вы должны использовать AsyncTask в Android.

Шаги для выполнения:

  • Создать вложенный класс, который расширяет AsyncTask
  • Реализовать doInBackground метод, где ваша логика должна находиться
  • Вызвать execute метод на вашем экземпляре вложенного класса, откуда вам нужно позвонить run()

Дело в том, что я не уверен, можно ли остановить асинтазу?

Вы можете отменить задание асинхронной используя cancel() метод на AsyncTask. Подробнее об этом см. В документации на Android.

Редактировать

Чтобы переместить код внутри функции run() к AsyncTask, вы поставите все, что «с настройкой» UI вещи внутри onPreExecute() таких как создание ProgressBar. Затем поместите свою работу так, чтобы вызвать sleep() и другие вещи, которые нельзя сделать на UI Thread внутри doInBackground(). Если вам нужно обновить строку поиска, вы можете сделать это в onProgressUpdate(), позвонив publishProgress() внутри doInBackground(). Наконец, если вам нужно убрать ProgressBar или сделать какой-то конец UI, вы сделаете это в onPostExecute().

Причина этого объяснения заключается в том, что все методы AsyncTask работают на UI Thread, за исключением doInBackground().

AsyncTask Docs

Vogella: Background tasks in Android

+0

Дело в том, что я не уверен, можно ли остановить асинтазу? Что я хочу, это просто обновить поисковую панель. Но, поскольку музыка может измениться, я не уверен, что лучше прекратить асинтаску при воспроизведении новой музыки и запустить новый экземпляр задачи или просто инициировать ее как onCreate, которая будет продолжать работать, ожидая начала музыки. Кроме того, можете ли вы, пожалуйста, сделать небольшой пример асинтезы, используя мой код? Спасибо – user3119384

+0

Вы можете отменить. См. Обновленный ответ. –

+0

Создание небольшого примера для вас на основе ваших нынешних исследований и понимания будет походить на ложку, кормящую вас. Вы должны правильно исследовать проблему, а затем задать вопрос, если у вас все еще есть сомнения. Так что, я бы не сделал для тебя немного примера. –

0
new Thread(this).start(); 

Хотя анонимный внутренний класс на любом обработчике или асинхронном режиме был бы лучше, чем сама работа Runnable.

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