从在UI线程中运行代码的角度来看,以下两者之间有什么区别:
MainActivity.this.runOnUiThread(new Runnable() {
public void run() {
Log.d("UI thread", "I am the UI thread");
}
});
or
MainActivity.this.myView.post(new Runnable() {
public void run() {
Log.d("UI thread", "I am the UI thread");
}
});
and
private class BackgroundTask extends AsyncTask<String, Void, Bitmap> {
protected void onPostExecute(Bitmap result) {
Log.d("UI thread", "I am the UI thread");
}
}
Pomber的回答是可以接受的,但是我不喜欢重复创建新对象。最好的解决方案总是那些试图减少内存占用的解决方案。是的,存在自动垃圾收集,但移动设备中的内存保护属于最佳实践的范围。
下面的代码更新服务中的TextView。
TextViewUpdater textViewUpdater = new TextViewUpdater();
Handler textViewUpdaterHandler = new Handler(Looper.getMainLooper());
private class TextViewUpdater implements Runnable{
private String txt;
@Override
public void run() {
searchResultTextView.setText(txt);
}
public void setText(String txt){
this.txt = txt;
}
}
它可以在任何地方使用,像这样:
textViewUpdater.setText("Hello");
textViewUpdaterHandler.post(textViewUpdater);
Pomber的回答是可以接受的,但是我不喜欢重复创建新对象。最好的解决方案总是那些试图减少内存占用的解决方案。是的,存在自动垃圾收集,但移动设备中的内存保护属于最佳实践的范围。
下面的代码更新服务中的TextView。
TextViewUpdater textViewUpdater = new TextViewUpdater();
Handler textViewUpdaterHandler = new Handler(Looper.getMainLooper());
private class TextViewUpdater implements Runnable{
private String txt;
@Override
public void run() {
searchResultTextView.setText(txt);
}
public void setText(String txt){
this.txt = txt;
}
}
它可以在任何地方使用,像这样:
textViewUpdater.setText("Hello");
textViewUpdaterHandler.post(textViewUpdater);
芬兰湾的科特林版:
Handler(Looper.getMainLooper()).post {
Toast.makeText(context, "Running on UI(Main) thread.", Toast.LENGTH_LONG).show()
}
或者如果你正在使用Kotlin协程:
在协程范围内添加:
withContext(Dispatchers.Main) {
Toast.makeText(context, "Running on UI(Main) thread.", Toast.LENGTH_LONG).show()
}