Кнопка отключения 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. Таким образом, вы можете рассмотреть возможность перенести ваш код на последний.

Другие вопросы по тегам