只能在主线程(ui线程)才能更新UI操作
原代码:
Factory.runOnAsync(new Runnable() {
@Override
public void run() {
String url = UploadHelper.uploadPortrait(photoFilePath);
Log.d(TAG, "run: 上传头像的路径为:" + url);
if (TextUtils.isEmpty(url)) {
// 上传失败
Log.d(TAG, "run: 头像上传失败");
//不能再主线程外执行更新UI操作、会产生错误
view.showError(R.string.data_upload_error);
Log.d(TAG, "run: 发现错误");
} else {
Log.d(TAG, "run: 开始上传头像");
// 构建Model
UserUpdateModel model = new UserUpdateModel("", url, desc,
isMan ? User.SEX_MAN : User.SEX_WOMAN);
// 进行网络请求,上传
UserHelper.update(model, UpdateInfoPresenter.this);
Log.d(TAG, "run: 上传头像成功");
}
}
});
Factory.runOnAsync(new Runnable() {
@Override
public void run() {
String url = UploadHelper.uploadPortrait(photoFilePath);
Log.d(TAG, "run: 上传头像的路径为:" + url);
if (TextUtils.isEmpty(url)) {
// 上传失败
Log.d(TAG, "run: 头像上传失败");
//不能在主线程外执行更新UI操作、会产生错误
handler.sendEmptyMessage(1);
Log.d(TAG, "run: 发现错误");
} else {
Log.d(TAG, "run: 开始上传头像");
// 构建Model
UserUpdateModel model = new UserUpdateModel("", url, desc,
isMan ? User.SEX_MAN : User.SEX_WOMAN);
// 进行网络请求,上传
UserHelper.update(model, UpdateInfoPresenter.this);
Log.d(TAG, "run: 上传头像成功");
}
}
});
使用handler进行线程间的通信,通知主线程更新UI
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
//通知UI更新
getView().showError(R.string.data_upload_error);
}
};
UI更新与线程通信
本文探讨了在Android开发中,如何正确地在主线程(UI线程)进行UI更新操作,避免因在非主线程尝试更新UI导致的错误。通过使用Handler机制实现线程间通信,确保所有UI操作都在主线程中安全执行。
1701

被折叠的 条评论
为什么被折叠?



