2016-05-16 5 views
1

ich nach einer Lösung gesucht und nicht finden kann, so werde ich hier fragen:Run auf UI-Thread von einer anderen Klasse

I setText Befehl in der mainActivity verwenden ist versucht, Bis jetzt habe ich verwendet habe, :

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

jetzt von einer anderen Klasse ich versuche, das gleiche zu tun, aber so kann ich nicht verwenden: MainActivity.this.

Ich habe versucht, den Code zu verwenden i ohne Erfolg auf eine andere Frage gefunden, das ist der Code:

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

Irgendwelche Vorschläge?

+0

Möglicherweise duplizieren: http://stackoverflow.com/questions/12850143/android-basics-running-code-in-the-ui-thread – shem

+0

Sind änderst du Text von anderem als Hauptthread? –

+0

Sie können einen Verweis von MainActivity in Ihrer Klasse behalten. Und durch diesen Verweis können Sie runOnUiThread-Methode aufrufen –

Antwort

1

Sie dieses Snippet verwenden können

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

Vielen Dank, es funktioniert und es ist einfach. –

2

Versuchen Sie dies nur um den Kontext zu anderen Klasse übergeben und dann wie dieses ich

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

verwenden schlagen Sie tu ein BroadcastReceiver im MainActivity verwenden. Registrieren Sie einen neuen Empfänger mit einer bestimmten Aktion und senden Sie eine Intent mit dieser Aktion von "einer anderen Klasse". Die MainActivity wird die Benachrichtigung erhalten und den Textview-Inhalt auf saubere Weise

MainActivity bearbeiten:

@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); 
} 

Eine andere Klasse:

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

Dies (das zweite Codebeispiel aus Ihrer Frage) ist die richtige Methode, um von einem zufälligen Ort aus auf einen UI-Thread zuzugreifen, obwohl Sie immer versuchen sollten, einen Kontext dafür zu haben :-)

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

Es funktioniert, und wenn es nicht, überprüfen Sie tut, wenn Sie in Ihrem Debugger ^^

0

meine Lösung Dies ist (mit MVVM, so aktiviert Debug-Protokolle haben keine Geschäftslogik in Aktivität), führen Sie dies in Ihrer Klasse (Viewmodel in meinem Fall):

runOnUiThread(() -> methodToExecute()); 

hier ist die Methode, die Umsetzung (ich habe dies in meiner Basis Ansichtsmodell):

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

Vergessen Sie nicht, message init:

messageHandler = new Handler(Looper.getMainLooper()); 
Verwandte Themen