以下代码在v1.setEnabled(false)
行上提供了致命异常异步任务#2。
这意味着在成功通话时禁用按钮。后台任务之前的v.setEnabled(false);
工作正常。请帮忙:(
public void onClick(View v) {
Intent intent = new Intent(DISPLAY_MESSAGE_ACTION);
//this one would work
//v.setEnabled(false);
final View v1=v;
mRegisterTask1 = new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... params) {
boolean success =
ServerUtilities.receipt (((String)v1.getTag()).substring(3),"acknowledged");
if (success) {
//this one causes Async Task exception
v1.setEnabled(false);
}
else {
}
return null;
}
@Override
protected void onPostExecute(Void result) {
mRegisterTask1 = null;
}
答案 0 :(得分:5)
您无法从后台线程更改UI状态
AsyncTask onPreExecute()
&amp;主线程中调用的onPostExecute()
个方法
看看:
public void onClick(View v) {
Intent intent = new Intent(DISPLAY_MESSAGE_ACTION);
//this one would work
//v.setEnabled(false);
final View v1=v;
mRegisterTask1 = new AsyncTask<Void, Void, Boolean>() {
@Override
protected Boolean doInBackground(Void... params) {
boolean success =
ServerUtilities.receipt (((String)v1.getTag()).substring(3),"acknowledged");
return success;
}
@Override
protected void onPostExecute(Bolean result) {
if (result) {
//this one causes Async Task exception
v1.setEnabled(false);
} else {
}
mRegisterTask1 = null;
}
}
}
答案 1 :(得分:0)
将ui修改移至onPostExecute
boolean success = false;
protected Void doInBackground(Void... params) {
success = ServerUtilities.receipt (((String)v1.getTag()).substring(3),"acknowledged");
if (success) {
//this one causes Async Task exception
v1.setEnabled(false);
} else {
}
return null;
}
@Override
protected void onPostExecute(Void result) {
if (success) {
//this one causes Async Task exception
v1.setEnabled(false);
} else {
}
mRegisterTask1 = null;
}
答案 2 :(得分:0)
您需要从UI线程更改小部件。方法onProgressUpdate
和OnPostExecute
在UI therad中执行。因此,您可以考虑将代码移至后者。