Quale sarebbe il modo migliore per aggiornare la mia UI? Dovrei andare per Handler o runOnUiThread?
Se il tuo Runnable
deve aggiornare l'interfaccia utente, pubblicarlo su runOnUiThread
.
Ma non è sempre possibile postare Runnable
sul thread UI.
Pensare allo scenario, in cui si desidera eseguire il funzionamento di rete/IO Oppure richiamare un servizio Web. In questo caso, non puoi postare Runnable
in UI Thread. Lanciare android.os.NetworkOnMainThreadException
Questi tipi di Runnable
devono essere eseguiti su thread diversi come HandlerThread. Dopo aver completato l'operazione, è possibile postare i risultati sul thread dell'interfaccia utente utilizzando Handler
, che è stato associato a Thread UI.
public void onClick(View view) {
// onClick on some UI control, perform Network or IO operation
/* Create HandlerThread to run Network or IO operations */
HandlerThread handlerThread = new HandlerThread("NetworkOperation");
handlerThread.start();
/* Create a Handler for HandlerThread to post Runnable object */
Handler requestHandler = new Handler(handlerThread.getLooper());
/* Create one Handler on UI Thread to process message posted by different thread */
final Handler responseHandler = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(Message msg) {
//txtView.setText((String) msg.obj);
Toast.makeText(MainActivity.this,
"Runnable on HandlerThread is completed and got result:"+(String)msg.obj,
Toast.LENGTH_LONG)
.show();
}
};
NetworkRunnable r1 = new NetworkRunnable("http://www.google.com/",responseHandler);
NetworkRunnable r2 = new NetworkRunnable("http://in.rediff.com/",responseHandler);
requestHandler.post(r1);
requestHandler.post(r2);
}
class NetworkRunnable implements Runnable{
String url;
Handler uiHandler;
public NetworkRunnable(String url,Handler uiHandler){
this.url = url;
this.uiHandler=uiHandler;
}
public void run(){
try {
Log.d("Runnable", "Before IO call");
URL page = new URL(url);
StringBuffer text = new StringBuffer();
HttpURLConnection conn = (HttpURLConnection) page.openConnection();
conn.connect();
InputStreamReader in = new InputStreamReader((InputStream) conn.getContent());
BufferedReader buff = new BufferedReader(in);
String line;
while ((line = buff.readLine()) != null) {
text.append(line + "\n");
}
Log.d("Runnable", "After IO call:"+ text.toString());
Message msg = new Message();
msg.obj = text.toString();
/* Send result back to UI Thread Handler */
uiHandler.sendMessage(msg);
} catch (Exception err) {
err.printStackTrace();
}
}
}
fonte
2017-09-05 13:47:25
'runOnUiThread' è solo una scorciatoia per pubblicare un' Runnable' su un 'Handler'. 'Handler' è la base di ogni (?) Funzione di comunicazione incrociata definita da Android (ad es.' AsyncTask''s 'onPostExecute' usa un' Handler' per fornire il risultato da 'doInBackground'). – zapl