2016-05-16 2 views
1

я искал решение и не мог найти один, так что я спрошу здесь:Run на UI нить из другого класса

Я пытаюсь использовать SetText команду в mainActivity, До сих пор я использовал :

MainActivity.this.runOnUiThread(new Runnable() { 
       public void run() { 
        textViewPrograss.setText(finalI + ""); 
       } 
      }); 

теперь я пытаюсь сделать то же самое, но из другого класса, так что я не могу использовать: MainActivity.this.

Я пытался использовать код я нашел на другой вопрос, но безуспешно, это код:

new Handler(Looper.getMainLooper()).post(new Runnable() { 
@Override 
public void run() { 
    Log.d("UI thread", "I am the UI thread"); 
}}); 

Любые предложения?

+0

Возможно дублировать: http://stackoverflow.com/questions/12850143/android-basics-running-code-in-the-ui-thread – shem

+0

ли вы меняете текст из другого основного потока? –

+0

Вы можете сохранить ссылку MainActivity в своем классе. И по этому поводу вы можете вызвать метод runOnUiThread –

ответ

1

Вы можете использовать этот фрагмент

textView.post(new Runnable() { 
     @Override 
     public void run() { 
      textView.setText("Text"); 
     } 
}); 
+0

Спасибо большое за его работу и ее легкость. –

2

Попробуйте это просто передать контекст другого класса, а затем использовать его как этот

((Activity)context).runOnUiThread(new Runnable() { 
       public void run() { 
        textViewPrograss.setText(finalI + ""); 
       } 
      }); 
1

Я предлагаю вам использовать ту BroadcastReceiver в MainActivity. Зарегистрируйте новый приемник с определенным действием и отправьте Intent с этим действием из «другого класса». MainActivity получит уведомление и может изменить содержание TextView в чистом виде

MainActivity:

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

    mReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      // update your text view 
      String text = intent.getStringExtra("text"); 
     } 
    }; 
    registerReceiver(mReceiver, new IntentFilter(MY_ACTION)); 
} 

@Override 
protected void onDestroy() { 
    super.onDestroy(); 
    unregisterReceiver(mReceiver); 
} 

Другой класс:

Intent intent = new Intent(MY_ACTION); 
intent.putExtra("text", "Your wonderful text"); 
// take a context reference (e.g. mContext) if you don't have a getContext() method 
getContext().sendBroadcast(intent); 
0

Это (второй пример кода из Вашего вопроса) является правильный способ доступа к потоку пользовательского интерфейса из случайного местоположения, хотя вы всегда должны пытаться создать контекст для этого :-)

new Handler(Looper.getMainLooper()).post(
    new Runnable() { 
     @Override 
     public void run() { 
      Log.d("UI thread", "I am the UI thread"); 
    }}); 

Это делает работу, и если это не происходит, проверьте, если у вас есть журналы отладки включены в ваш отладчик ^^

0

Это мое решение (с использованием MVVM, так что нет бизнес-логика в деятельности), запустите в своем классе (ViewModel в моем случае):

runOnUiThread(() -> methodToExecute()); 

здесь является реализация метода (у меня есть это в моей базе ViewModel):

private Handler messageHandler; 
protected void runOnUiThread(Runnable action) { 
    messageHandler.post(action); 
} 

Не забудьте инициализировать MessageHandler:

messageHandler = new Handler(Looper.getMainLooper()); 
Смежные вопросы