2016-11-08 3 views
-1

Я не знаю, является ли это подходящим заголовком для этого вопроса, но это происходит примерно так.Как приостановить основную тему u.i (Android)

Я запускаю цикл for на моей основной и.и.и нити длиной около 1000. Это довольно много, не следует ли мне это делать в AsyncTask или что-то еще, так как это занимает довольно долгое время и может заморозить приложение? Да, я знаю, но главное, что я делаю в основной теме.

здесь возникает проблема

я есть TextView на пользовательском интерфейсе, что я хочу, чтобы установить его значение, когда цикл достигает определенного числа. Но поскольку он конкурирует с циклом, который уже запущен, он не будет работать до тех пор, пока цикл цикла не будет завершен.

for (int i = 0; i < 3000; i++){ 

    if(i = 400) { 

     textView.setText('blah ' + i); 
    } 

} 

мой вопрос, как я приостановить цикл, обновить TextView и продолжить цикл после этого в то время как в том же потоке. Я пробовал Thread.yield() без каких-либо результатов. Любые предложения будут высоко оценили

+0

«Да, я знаю, но важно, что я делаю на главной теме»: можете ли вы объяснить, почему? Вы правильно определили проблему, делая большую работу над основным потоком, это не очень хорошая идея. – Henry

+0

Я боюсь, что это невозможно, потому что поток выполняет код в линейном режиме, а Java не имеет 'goto'. Я вижу некоторые варианты, например, использование 'break' в' for', обновление пользовательского интерфейса и повторное выполнение 'for' или правильное использование других потоков для параллелизации цикла' for' с обновлением UI – nandsito

+0

@Henry i don ' Не обращайте внимания на замораживание приложения, я действительно предпочитаю, чтобы каждый мог делать что угодно, пока цикл работает. Теперь я хочу, чтобы иметь возможность приостановить мой основной поток, а затем setTextview и продолжить цикл. –

ответ

0

Создать IntentService, запустить цикл там в onHandleIntent, когда вы получите ваш определенное количество использования sendBroadcast вашей деятельности, и в onReceive обновлении textView.

public class MyService extends IntentService { 
    public MyService() { 
     super("MyService"); 
    } 
    @Override 
    protected void onHandleIntent(Intent intent) { 
     for (int i = 0; i < 3000; i++){ 
      if(i == 400) { 
       sendBroadcast(new Intent("com.example.android.myApp.SOME_KEY")); 
      } 
     } 
    } 
} 

В вашем MainActivity, onCreate:

registerReceiver(broadcastReceiver, new IntentFilter("com.example.android.myApp.SOME_KEY")); 

за пределами вашей onCreate:

BroadcastReceiver broadcastReceiver = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     textView.setText("great"); 
    } 
}; 

Не забудьте добавить Service к Manifest.

+0

пример пожалуйста? –

+0

Я отредактировал свой ответ. –

+0

Спасибо, попробуй и вернись –

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