2012-02-21 4 views
3

Я запрограммировал приложение-викторину, и если я коснусь одного из ответов в AsyncTask, если ответ правильный, я установил цвет в зеленый цвет или если он будет ложным до красного.Отключить кнопки во время AsyncTask

Но теперь, во время выполнения AsyncTask, я могу нажать другие кнопки, например, кнопку «изменить вопрос» или на другой ответ. Затем это делается после завершения работы AsyncTask. Итак, следующий вопрос загружен, и он автоматически отвечает на следующий вопрос или использует одного из джокеров, что когда-либо.

Я попытался установитьEnabled (false) кнопки, но они все еще прослушиваются.

Как предотвратить это?

private void disableOrDisableButtons(boolean boo) { 
     buttonAnswer1.setEnabled(boo); 
     buttonAnswer2.setEnabled(boo); 
     buttonAnswer3.setEnabled(boo); 
     buttonAnswer4.setEnabled(boo); 
    } 

и вот я начинаю AsyncTask

disableOrDisableButtons(false); 
new PrepareAdapter().execute(null, null, null); 

в моей AsyncTask

@Override 
     protected void onPreExecute() { 
      disableOrDisableButtons(false); 
      if (correctAnswerAtButton != buttonClicked) { 
       switch (buttonClicked) { 
       case 1: 
        buttonAnswer1.setTextColor(Color.RED); 
        break; 
       case 2: 
        buttonAnswer2.setTextColor(Color.RED); 
        break; 
       case 3: 
        buttonAnswer3.setTextColor(Color.RED); 
        break; 
       case 4: 
        buttonAnswer4.setTextColor(Color.RED); 
        break; 
       } 
       if (buttonClicked != 0) { // 0.. if second chance joker used 
        wrongAnswer = true; 
       } 
      } 
      switch (correctAnswerAtButton) { 
      case 1: 
       buttonAnswer1.setTextColor(Color.GREEN); 
       return; 
      case 2: 
       buttonAnswer2.setTextColor(Color.GREEN); 
       return; 
      case 3: 
       buttonAnswer3.setTextColor(Color.GREEN); 
       return; 
      case 4: 
       buttonAnswer4.setTextColor(Color.GREEN); 
       return; 
      } 
     } 
+1

Если это не какое-то учебное упражнение, прекратите использовать потоки. Это не приложение, которое должно быть многопоточным вообще, и это просто создает дополнительные проблемы для вас. –

+0

так что я должен делать? спасибо за ваш ответ – androiddevjedi

+0

Просто делайте все в главном потоке пользовательского интерфейса. Я предполагаю, что задействованная обработка довольно тривиальна, поэтому нет необходимости открывать поток пользовательского интерфейса. –

ответ

0

Так я использую его сейчас, чтобы заблокировать экран во время AsyncTask. Для меня это сейчас прекрасно. Надеюсь, это поможет вам.

private class PrepareAdapter extends AsyncTask<Void, Void, Integer> 
      implements DialogInterface.OnCancelListener { 
     private Dialog dialog = null; 

     @Override 
     protected void onPreExecute() { 
      // To disable the whole screen --> setCancelable(false); 
      dialog = new Dialog(WerWeissWasQuizActivity.this, android.R.style.Theme_Translucent_NoTitleBar_Fullscreen); 
      dialog.setCancelable(false); 
      dialog.show(); 
     } 

     @Override 
     protected Integer doInBackground(Void... params) { 
      dialog.dismiss(); 
      return 0; 
     } 

     @Override 
     protected void onPostExecute(Integer result) { 
      // TODO Auto-generated method stub 
      super.onPostExecute(result); 
      //do other stuff... 
     } 

     @Override 
     public void onCancel(DialogInterface dialog) { 
      // TODO Auto-generated method stub 
      cancel(true); 
     } 
    } 
1

Я хочу отключить весь интерфейс, а AsyncTask работает, вы можете использовать код, такие как следующие, чтобы отобразить диалоговое окно:

public abstract class BaseAsyncTask<Param, Result> extends AsyncTask<Param, Void, Result> implements DialogInterface.OnCancelListener { 
    private static final String TAG = "BaseAsyncTask"; 
    private ProgressDialog dialog = null; 
    protected Context ctx = null; 
    protected Exception exception = null; 

    public BaseAsyncTask(Context ctx) { 
     this.ctx = ctx; 
    } 

    @Override 
    protected void onPreExecute() { 
     dialog = ProgressDialog.show(ctx, WLConstants.MSG_TITLE_LOADING_DIALOG, WLConstants.MSG_LOADING_DIALOG, true); 
     dialog.setCancelable(true); 
     dialog.setOnCancelListener(this); 
     if (ctx instanceof WozzonActivity) { 
      ((WozzonActivity) ctx).setCurrentDialog(dialog); 
     } 
    } 

    @Override 
    protected Result doInBackground(Param... parameters) { 
     try { 
      return inBackground(parameters); 
     } catch (Exception ex) { 
      exception = ex; 
      Log.e(TAG, ex.getClass().getName(), ex); 
      return null; 
     } 
    }; 

    @Override 
    protected void onPostExecute(Result result) { 
     try { 
      dialog.dismiss(); 
     } catch (Exception ex) { 
     }// TODO: 
     if (result == null) { 
      onException(exception); 
     } else { 
      onResult(result); 
     } 
    } 

    protected void onException(Exception ex) { 
     if (ex != null && ex instanceof WozzonException) { 
      Toast.makeText(ctx, ex.getMessage(), Toast.LENGTH_SHORT).show(); 
     } else { 
      Toast.makeText(ctx, WLConstants._ERROR_MSG, Toast.LENGTH_SHORT).show(); 
     } 

    } 

    public abstract void onResult(Result result); 
    public abstract Result inBackground(Param... parameters) throws Exception; 

    @Override 
    public void onCancel(DialogInterface theDialog) { 
     cancel(true); 
    } 
} 
+0

привет спасибо за ваш ответ. так что я должен отобразить диалог? – androiddevjedi

+0

Это вопрос предпочтения, я думаю ... Я предпочитаю отображать диалоговое окно «Подождите», показанное выше, чтобы я не отключил каждый отдельный элемент интерфейса. Это увеличит общую сложность кода. Также пользователь точно знает, что происходит, если он видит что-то подобное. Но некоторым пользователям это не понравится, я думаю ... –

0

Вашей проблема не связана с потоками на всех. Попробуйте setTextColor (# ff0000) и settextColor (# 00ff00) вместо settextColor (Color.RED) и setTextColor (Color.GREEN).

+0

ладно спасибо, я попробую это сегодня. – androiddevjedi

Смежные вопросы