2013-09-27 67 views
-1

如何将以下代码与异步任务合并。我看到很多教程,并对代码进行了更改,但无法完成。这段代码是完全正常的,并且正常工作,但有人建议我使它成为异步任务,这样当我按下按钮时,它需要一些时间才能启动。所以请有人在其中添加异步任务代码以使其工作正常。如何实现AsyncTask以延迟按钮

代码: -

public class QuestionActivity extends Activity implements OnClickListener{ 

private Question currentQ; 
private GamePlay currentGame; 
private CountDownTimer counterTimer; 

     @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.question); 
      processScreen(); 
    } 
      /** 
    * Configure current game and get question 
    */ 
    private void processScreen() 
    { 
    currentGame = ((CYKApplication)getApplication()).getCurrentGame(); 
    currentQ = currentGame.getNextQuestion(); 
    Button nextBtn1 = (Button) findViewById(R.id.answer1); 
    nextBtn1.setOnClickListener(this); 
    Button nextBtn2 = (Button) findViewById(R.id.answer2); 
    nextBtn2.setOnClickListener(this); 
    Button nextBtn3 = (Button) findViewById(R.id.answer3); 
    nextBtn3.setOnClickListener(this); 
    Button nextBtn4 = (Button) findViewById(R.id.answer4); 
    nextBtn4.setOnClickListener(this); 
    Button nextBtn5 = (Button) findViewById(R.id.answer5); 
    nextBtn5.setOnClickListener(this); 
    /** 
    * Update the question and answer options.. 
    */ 
    setQuestions(); 

} 


/** 
* Method to set the text for the question and answers from the current games 
* current question 
*/ 
private void setQuestions() { 
    //set the question text from current question 
    String question = Utility.capitalise(currentQ.getQuestion()); 
    TextView qText = (TextView) findViewById(R.id.question); 
    qText.setText(question); 

    //set the available options 
    List<String> answers = currentQ.getQuestionOptions(); 
    TextView option1 = (TextView) findViewById(R.id.answer1); 
    option1.setText(Utility.capitalise(answers.get(0))); 

    TextView option2 = (TextView) findViewById(R.id.answer2); 
    option2.setText(Utility.capitalise(answers.get(1))); 

    TextView option3 = (TextView) findViewById(R.id.answer3); 
    option3.setText(Utility.capitalise(answers.get(2))); 

    TextView option4 = (TextView) findViewById(R.id.answer4); 
    option4.setText(Utility.capitalise(answers.get(3))); 

    int score = currentGame.getScore(); 
    String scr = String.valueOf(score); 
    TextView score1 = (TextView) findViewById(R.id.score); 
    score1.setText(scr); 

    counterTimer=new CountDownTimer(15000, 1000) { 
     public void onFinish() {     
      if(currentGame.getRound()==20) 
       System.exit(0); 
      currentGame.decrementScore(); 
      processScreen(); 
         } 

     public void onTick(long millisUntilFinished) { 
      TextView time = (TextView) findViewById(R.id.timers); 
      time.setText(""+millisUntilFinished/1000); 
          } 
    }; 
    counterTimer.start(); 
} 


@Override 
public void onResume() { 
    super.onResume(); 
} 


@Override 
public void onClick(View arg0) { 
    //Log.d("Questions", "Moving to next question"); 
    if(arg0.getId()==R.id.answer5) 
    { 
    new AlertDialog.Builder(this).setMessage("Are you sure?").setCancelable(true).setPositiveButton("Yes", 
    new DialogInterface.OnClickListener() { 
    public void onClick(DialogInterface dialog, 
    int id) { 
      finish(); 
      } 
     }).setNegativeButton("No", null).show(); 

      } 

    else 
    { 
     if(!checkAnswer(arg0)) return; 

    /** 
    * check if end of game 
    */ 
    if (currentGame.isGameOver()){ 
     //Log.d("Questions", "End of game! lets add up the scores.."); 
     //Log.d("Questions", "Questions Correct: " + currentGame.getRight()); 
     //Log.d("Questions", "Questions Wrong: " + currentGame.getWrong()); 
     Intent i = new Intent(this, EndgameActivity.class); 
     startActivity(i); 
     finish(); 
    } 
     else 
     { 
     Intent i = new Intent(this, QuestionActivity.class); 
        finish(); 
        startActivity(i); 
    } 
    } 
    } 



@Override 
public boolean onKeyDown(int keyCode, KeyEvent event) 
{ 
    switch (keyCode) 
    { 
    case KeyEvent.KEYCODE_BACK : 
     return true; 
    } 

    return super.onKeyDown(keyCode, event); 
} 


/** 
* Check if a checkbox has been selected, and if it 
* has then check if its correct and update gamescore 
*/ 
private boolean checkAnswer(View v) { 

    Button b=(Button) v; 
    String answer = b.getText().toString(); 
    counterTimer.cancel(); 
    b.setBackgroundResource(R.drawable.ans); 
    b.setEnabled(false); 
       //Log.d("Questions", "Valid Checkbox selection made - check if correct"); 
     if (currentQ.getAnswer().equalsIgnoreCase(answer)) 
     { 
      b.setBackgroundResource(R.drawable.ansgreen); 
      //Log.d("Questions", "Correct Answer!"); 
      currentGame.incrementScore(); 
     } 
     else{ 
      b.setBackgroundResource(R.drawable.ansred); 
      //Log.d("Questions", "Incorrect Answer!"); 
      currentGame.decrementScore1(); 
     } 

     return true; 
    } 


} 

希望有人能帮助我。

由于提前

+0

你想延迟哪个代码? –

+0

我想拖延按钮(nextBtn1,nextBtn2,nextBtn3,nextBtn4)。 – UchihaSasuke

回答

1

使用Runnable

private static final int START_AFTER_SECONDS = 10; 
... 
Runnable mRunnable; 
Handler mHandler = new Handler(); 
mRunnable = new Runnable() { 
    @Override 
    public void run() { 
     //DELAYED CODE HERE 
    } 
}; 
mHandler.postDelayed(mRunnable, START_AFTER_SECONDS * 1000); 
+0

它是如何在我的代码中锻炼的 – UchihaSasuke

+0

我不清楚你想要推迟什么代码。只需将它放在代码所在的位置,然后将此代码粘贴到'run()'方法内。 – sswierczek

1

的AsyncTask是不是这个工作的工具。试试这个

getHandler().postDelayed(
    new Runnable { 
      void run() 
      { 
      methodToCall(); 
      } 
     }, delayTimeInMilliseconds); 
+0

您可以将此代码与我的代码合并,我已经尝试过但未成功实施它。 – UchihaSasuke

+0

我真的坚持使用runnable,Handler和asyncTask。 – UchihaSasuke