Cách tốt nhất để cập nhật giao diện người dùng của tôi là gì? Tôi có nên đến Handler hoặc runOnUiThread không?
Nếu số điện thoại Runnable
của bạn cần cập nhật giao diện người dùng, hãy đăng nó trên runOnUiThread
.
Nhưng không phải lúc nào cũng có thể đăng Runnable
trên Chủ đề giao diện người dùng.
Nghĩ về kịch bản, nơi bạn muốn thực hiện Hoạt động mạng/IO Hoặc gọi dịch vụ web. Trong trường hợp này, bạn không thể đăng Runnable
vào Chủ đề giao diện người dùng. Nó sẽ ném android.os.NetworkOnMainThreadException
Đây là loại Runnable
nên chạy trên các chủ đề khác nhau như HandlerThread. Sau khi hoàn thành hoạt động của bạn, bạn có thể đăng kết quả trở lại Giao diện người dùng bằng cách sử dụng Handler
, đã được liên kết với Giao diện người dùng.
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();
}
}
}
Nguồn
2017-09-05 13:47:25
'runOnUiThread' chỉ là một phím tắt để đăng' Runnable' đến 'Handler'. 'Handler' là cơ sở của mỗi (?) Cơ sở giao tiếp luồng chéo được xác định bởi Android (ví dụ:' onPostExecute' của AsyncTask' sử dụng một 'Handler' để phân phối kết quả từ' doInBackground'). – zapl