Кнопка отключения Android при успешном вызове doinbackground
Следующий код дает Fatal Exception Async Task #2 в строке v1.setEnabled(false)
,
Это означает отключить кнопку при успешном звонке. 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;
}
3 ответа
Решение
Переместить модификацию пользовательского интерфейса в 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;
}
Вы не можете изменить состояние интерфейса из фонового потока.
AsyncTask onPreExecute()
& 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;
}
}
}
Вам нужно изменить виджеты из потока пользовательского интерфейса. Методы onProgressUpdate
а также OnPostExecute
выполнены в UI Therad. Таким образом, вы можете рассмотреть возможность перенести ваш код на последний.