2015-09-21 4 views
2

Брус доступа время в AsyncTask, переменная point не изменяется большеКак получить таймер из asynctask?

Вот мой код:

import android.app.Activity; 
import android.content.Intent; 
import android.graphics.drawable.BitmapDrawable; 
import android.media.MediaPlayer; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.os.SystemClock; 
import android.view.View; 
import android.widget.Button; 
import android.widget.ImageView; 
import android.widget.ProgressBar; 
import android.widget.TextView; 

import java.util.ArrayList; 
import java.util.Collections; 
import java.util.Random; 

public class GamePlayActivity extends Activity { 

    ArrayList<Player> arrPlayer = new ArrayList<Player>(); 
    TextView tvLevel, tvPoint; 
    ImageView ivGuessedImage; 
    Button btn1stChoice, btn2ndChoice, btn3rdChoice, btn4thChoice; 
    int level = 1; 
    int point = 0; 
    Random rand = new Random(System.currentTimeMillis()); 
    ProgressBar customProgress; 
    TextView progressDisplay; 
    int myProgress; 
    MediaPlayer mp1, mp2; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.layout_gameplayactivity); 

     mp1 = MediaPlayer.create(GamePlayActivity.this, R.raw.uefa_champion_league); 
     mp2 = MediaPlayer.create(GamePlayActivity.this, R.raw.the_time_of_our_life); 
     mp1.start(); 
     mp1.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 
      @Override 
      public void onCompletion(MediaPlayer mp) { 
       mp2.start(); 
      } 
     }); 
     mp2.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 
      @Override 
      public void onCompletion(MediaPlayer mp) { 
       mp1.start(); 
      } 
     }); 


     tvLevel = (TextView) findViewById(R.id.tvLevel); 
     tvPoint = (TextView) findViewById(R.id.tvPoint); 
     ivGuessedImage = (ImageView) findViewById(R.id.ivGuessedImage); 
     btn1stChoice = (Button) findViewById(R.id.btn1stChoice); 
     btn2ndChoice = (Button) findViewById(R.id.btn2ndChoice); 
     btn3rdChoice = (Button) findViewById(R.id.btn3rdChoice); 
     btn4thChoice = (Button) findViewById(R.id.btn4thChoice); 

     arrPlayer = createPlayer(); 
     Collections.shuffle(arrPlayer); 
     int resID = getResources().getIdentifier(arrPlayer.get(0).getPlayerFile(), "drawable", getPackageName()); 
     ivGuessedImage.setImageResource(resID); 
     btn1stChoice.setText(arrPlayer.get(0).getPlayerName()); 
     btn2ndChoice.setText(arrPlayer.get(1).getPlayerName()); 
     btn3rdChoice.setText(arrPlayer.get(2).getPlayerName()); 
     btn4thChoice.setText(arrPlayer.get(3).getPlayerName()); 

     customProgress = (ProgressBar)findViewById(R.id.customProgress); 
     progressDisplay = (TextView)findViewById(R.id.progressDisplay); 
     new ShowCustomProgressBarAsyncTask().execute(); 
     if(myProgress < 1){ 
      Intent intent = new Intent(GamePlayActivity.this, GameOverActivity.class); 
      startActivity(intent); 
     } 

     btn1stChoice.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       if (btn1stChoice.getText().toString() == arrPlayer.get(0).getPlayerName()) { 
        final MediaPlayer mp = MediaPlayer.create(GamePlayActivity.this, R.raw.right_answer); 
        mp.start(); 
        point = point + 2; 
        tvPoint.setText(point + " Point"); 
        createNewLevel(); 
        myProgress = 100; 
       } else { 
        final MediaPlayer mp = MediaPlayer.create(GamePlayActivity.this, R.raw.wrong_answer); 
        mp.start(); 
        Intent intent = new Intent(GamePlayActivity.this, GameOverActivity.class); 
        intent.putExtra("Point", point); 
        startActivity(intent); 
       } 
      } 
     }); 

     btn2ndChoice.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       if(btn2ndChoice.getText().toString() == arrPlayer.get(0).getPlayerName()){ 
        final MediaPlayer mp = MediaPlayer.create(GamePlayActivity.this, R.raw.right_answer); 
        mp.start(); 
        point = point + 2; 
        tvPoint.setText(point + " Point"); 
        createNewLevel(); 
        myProgress = 100; 
       } 
       else{ 
        final MediaPlayer mp = MediaPlayer.create(GamePlayActivity.this, R.raw.wrong_answer); 
        mp.start(); 
        Intent intent = new Intent(GamePlayActivity.this, GameOverActivity.class); 
        intent.putExtra("Point", point); 
        startActivity(intent); 
       } 
      } 
     }); 

     btn3rdChoice.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       if(btn3rdChoice.getText().toString() == arrPlayer.get(0).getPlayerName()){ 
        final MediaPlayer mp = MediaPlayer.create(GamePlayActivity.this, R.raw.right_answer); 
        mp.start(); 
        point = point + 2; 
        tvPoint.setText(point + " Point"); 
        createNewLevel(); 
        myProgress = 100; 
       } 
       else{ 
        final MediaPlayer mp = MediaPlayer.create(GamePlayActivity.this, R.raw.wrong_answer); 
        mp.start(); 
        Intent intent = new Intent(GamePlayActivity.this, GameOverActivity.class); 
        intent.putExtra("Point", point); 
        startActivity(intent); 
       } 
      } 
     }); 

     btn4thChoice.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       if(btn4thChoice.getText().toString() == arrPlayer.get(0).getPlayerName()){ 
        final MediaPlayer mp = MediaPlayer.create(GamePlayActivity.this, R.raw.right_answer); 
        mp.start(); 
        point = point + 2; 
        tvPoint.setText(point + " Point"); 
        createNewLevel(); 
        myProgress = 100; 
       } 
       else{ 
        final MediaPlayer mp = MediaPlayer.create(GamePlayActivity.this, R.raw.wrong_answer); 
        mp.start(); 
        Intent intent = new Intent(GamePlayActivity.this, GameOverActivity.class); 
        intent.putExtra("Point", point); 
        startActivity(intent); 
       } 
      } 
     }); 

    } 

    public class ShowCustomProgressBarAsyncTask extends AsyncTask<Void, Integer, Void> { 

     @Override 
     protected void onPreExecute() { 
      myProgress = 100; 
     } 

     @Override 
     protected Void doInBackground(Void... params) { 
      while(myProgress>0){ 
       myProgress--; 
       publishProgress(myProgress); 
       SystemClock.sleep(200); 
      } 
      return null; 
     } 

     @Override 
     protected void onProgressUpdate(Integer... values) { 
      customProgress.setProgress(values[0]); 
      customProgress.setSecondaryProgress(values[0] + 1); 
      progressDisplay.setText(String.valueOf(myProgress)+"%"); 
     } 

     @Override 
     protected void onPostExecute(Void result) { 
     } 
    } 

    public void createNewLevel(){ 
     arrPlayer.remove(0); 
     Collections.shuffle(arrPlayer); 
     int randomButtonChoice = rand.nextInt(4); 
     int resID = getResources().getIdentifier(arrPlayer.get(0).getPlayerFile(), "drawable", getPackageName()); 
     ((BitmapDrawable)ivGuessedImage.getDrawable()).getBitmap().recycle(); 
     ivGuessedImage.setImageResource(resID); 
     switch (randomButtonChoice){ 
      case 0: { 
       btn1stChoice.setText(arrPlayer.get(0).getPlayerName()); 
       btn2ndChoice.setText(arrPlayer.get(1).getPlayerName()); 
       btn3rdChoice.setText(arrPlayer.get(2).getPlayerName()); 
       btn4thChoice.setText(arrPlayer.get(3).getPlayerName()); 

       break; 
      } 
      case 1: { 
       btn1stChoice.setText(arrPlayer.get(1).getPlayerName()); 
       btn2ndChoice.setText(arrPlayer.get(0).getPlayerName()); 
       btn3rdChoice.setText(arrPlayer.get(2).getPlayerName()); 
       btn4thChoice.setText(arrPlayer.get(3).getPlayerName()); 

       break; 
      } 
      case 2: { 
       btn1stChoice.setText(arrPlayer.get(1).getPlayerName()); 
       btn2ndChoice.setText(arrPlayer.get(2).getPlayerName()); 
       btn3rdChoice.setText(arrPlayer.get(0).getPlayerName()); 
       btn4thChoice.setText(arrPlayer.get(3).getPlayerName()); 

       break; 
      } 
      case 3: { 
       btn1stChoice.setText(arrPlayer.get(1).getPlayerName()); 
       btn2ndChoice.setText(arrPlayer.get(2).getPlayerName()); 
       btn3rdChoice.setText(arrPlayer.get(3).getPlayerName()); 
       btn4thChoice.setText(arrPlayer.get(0).getPlayerName()); 

       break; 
      } 
     } 
     level++; 
     tvLevel.setText("Level " + level); 
    } 
    } 
} 
+0

лично я не понимаю, что это ваша проблема, и что вы просите ... Вы должны получить значения из AsyncTask в onProgressUpdate, вот и все. – mihail

+0

Я не могу получить значение myProgress, когда я устанавливаю OnClickListener, я хочу присвоить a = a * myProgress, но он не присваивается, обратный отсчет ProgressBar от 100 до 0. Например, он запускается в 82, я хочу, чтобы a = 82. – Khuong

+0

Вы хотите получить прогресс в переменную 'a', когда она достигнет определенного значения. правильно? – Emil

ответ

1

Вы можете сделать это с интерфейсом

создать интерфейс в вашем AsyncTask , и создать метод, который будет использоваться в качестве обратного вызова

public class ShowCustomProgressBarAsyncTask extends AsyncTask<Void, Integer, Void> { 
    interface ProgressListner { 
     public void onProgressChanged(int progress); 
    } 
    private ProgressListner listner; 
    public ShowCustomProgressBarAsyncTask(ProgressListner listner) { 
     this.listner = listner; 
    } 
    //..your remaining codes 

    @Override 
    protected void onProgressUpdate(Integer... values) { 
     //..your remaining codes 
     listner.onProgressChanged(values[0]); 
    } 
} 

Затем выполните это интерфейс в вашей деятельности.

Также передайте экземпляр интерфейса через конструктор в AsyncTask.

Затем с помощью этого экземпляра вы можете обратный вызов метода, который будет передавать значение прогресса

public class GamePlayActivity extends Activity implements ProgressListner{ 
    //.. your remaining codes 

    new ShowCustomProgressBarAsyncTask(this).execute(); 

    public void onProgressChanged(int progress) { 
     a = progress; 
    } 
} 
+0

The ProgressBar не делает обратный отсчет и как может setOnClickListener назначить a = прогресс? – Khuong

+0

Но, когда я делаю своим путем, ProgressBar больше не обращается к отсчету – Khuong

+0

Переменная не изменилась, я просто попробовал – Khuong

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