2012-02-21 56 views
3

我編寫了一個測驗應用程序,如果我在AsyncTask中觸摸其中一個答案(如果答案正確),我將顏色設置爲綠色或將其設置爲紅色。在AsyncTask期間禁用按鈕

但現在在AsyncTask運行期間,我可以按其他按鈕,如「更改問題」按鈕或另一個答案。然後在AsyncTask完成它的工作後完成。所以下一個問題會被加載,並自動回答下一個問題,或者使用其中一個jokers。

我試圖setEnabled(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

除非是某種訓練練習,否則不要使用線程。它不是那種需要多線程的應用程序,它只是爲您創建更多的問題。 – 2012-02-21 14:13:09

+0

那我該怎麼辦呢?感謝您的回答 – androiddevjedi 2012-02-21 14:30:22

+0

只需在主UI線程中做所有事情。我想象所涉及的處理是相當平凡的,所以不需要保持UI線程打開。 – 2012-02-21 14:40:08

回答

0

這是我現在用AsyncTask鎖定我的屏幕的方式。對我而言,現在是完美的。希望它可以幫助你。

​​3210
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 2012-02-21 14:28:48

+0

這是一個偏好問題,我猜...我更喜歡顯示上面顯示的「請稍候」對話框,以便我不禁用每個接口項目。這會增加你的整體代碼複雜度。如果用戶看到類似的東西,用戶也會知道到底發生了什麼。但有些用戶不會喜歡它,我想... – 2012-02-21 16:35:38

0

您的問題是不相關的線程在所有。嘗試setTextColor(#ff0000)和settextColor(#00ff00),而不是settextColor(Color.RED)和setTextColor(Color.GREEN)。

+0

好吧謝謝你,我今天就試試這個。 – androiddevjedi 2012-02-22 09:15:07