带有JSON数据的二维数组 - 下载数据,但我无法访问它(?)

时间:2015-03-24 02:15:40

标签: java android android-fragments multidimensional-array retrofit

所以,我正在创建一个用于学习目的的小琐事游戏,但我遇到了一个问题。

首先,我有一个特定的Android Fragment从JSON获取数据,我将简单地在回调方法上使用该数据并将其显示在TextViews和Buttons上。一切都很好,但是,每次我回到那个片段时,都会有同样的问题。所以我决定在回调方法之外以更好的方式处理它。

这里的问题是显然我的Arrays是null或者它们的长度是零。这很奇怪,因为根据我的LOG,数据正在回调方法上传递给那些数组。

这是我的完整片段代码。谢谢!

public class GameFragment extends Fragment {

private TextView txtQuestion;
private Button btnAnswer1;
private Button btnAnswer2;
private Button btnAnswer3;
private Button btnAnswer4;

private Questions[] gameQuestions;
private Questions[] animeQuestions;
private Questions[] techQuestions;
private Questions[] movieQuestions;
private Questions[][] gameCategories = new Questions[4][];

int correctAnswer = -1;

private TransparentProgressDialog progressBar;
private Handler handler;
private Runnable runnable;


Callback cb = new Callback<MyApiData>(){

    @Override
    public void success(MyApiData myApiData, Response response) {

        gameCategories[0] = new Questions[myApiData.getCategory()[0].getQuestions(0).length];
        gameCategories[1] = new Questions[myApiData.getCategory()[1].getQuestions(1).length];
        gameCategories[2] = new Questions[myApiData.getCategory()[2].getQuestions(2).length];
        gameCategories[3] = new Questions[myApiData.getCategory()[3].getQuestions(3).length];

        //gameCategories = new Questions[][] {gameQuestions, animeQuestions, techQuestions, movieQuestions};

        for(int i = 0; i < 4 ; i++){
            for(int j = 0; j < gameCategories[i].length ; j++){
                gameCategories[i][j] = myApiData.getCategory()[i].getQuestions(i)[j];
                //Log.d("GameFragment", "gameCategories[i][j] - gameCategories["+i+"]["+j+"]: " + gameCategories[i][j].getQuestion());
            }
        }

        //displayQuestion();
        progressBar.dismiss();
        displayQuestion();
    }

    @Override
    public void failure(RetrofitError error) {
        Log.d("GameScreen", "Callback failed!");
    }
};

public GameFragment() {
    // Required empty public constructor
}


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

    View view = inflater.inflate(R.layout.fragment_game, container, false);

    txtQuestion = (TextView) view.findViewById(R.id.txtQuestion);

    btnAnswer1 = (Button) view.findViewById(R.id.btnAnswer1);
    btnAnswer2 = (Button) view.findViewById(R.id.btnAnswer2);
    btnAnswer3 = (Button) view.findViewById(R.id.btnAnswer3);
    btnAnswer4 = (Button) view.findViewById(R.id.btnAnswer4);

    btnAnswer1.setOnClickListener(new View.OnClickListener() {
        @Override public void onClick(View view) { checkAnswer(view); } });
    btnAnswer2.setOnClickListener(new View.OnClickListener() {
        @Override public void onClick(View view) { checkAnswer(view); } });
    btnAnswer3.setOnClickListener(new View.OnClickListener() {
        @Override public void onClick(View view) { checkAnswer(view); } });
    btnAnswer4.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            checkAnswer(view);
        }
    });

    handler = new Handler();
    progressBar = new TransparentProgressDialog(getActivity(), R.drawable.loading_spinner);
    runnable = new Runnable() {
        @Override
        public void run() {
            if (progressBar.isShowing()) {
                progressBar.dismiss();
            }
        }
    };

    //launchRingDialog();
    //RestClient.get().getQuestions(cb);
    // Inflate the layout for this fragment
    return view;
}


public void launchRingDialog() {

    new Thread(new Runnable() {
        public void run(){
            try {
                Log.d("Thred", "Try");
                progressBar.show();
                RestClient.get().getQuestions(cb);
                //Thread.sleep(10000);
            } catch (Exception e) {

            }
            //progressBar.dismiss();
        }

    }).start();
}


public void checkAnswer(View v){

    switch(v.getId()){
        case R.id.btnAnswer1:
            if(correctAnswer == 1){
                feedback(true, btnAnswer1);
            }else {
                feedback(false, btnAnswer1);
            }
            break;
        case R.id.btnAnswer2:
            if(correctAnswer == 2){
                feedback(true, btnAnswer2);
            }else {
                feedback(false, btnAnswer2);
            }
            break;
        case R.id.btnAnswer3:
            if(correctAnswer == 3){
                feedback(true, btnAnswer3);
            }else {
                feedback(false, btnAnswer3);
            }
            break;
        case R.id.btnAnswer4:
            if(correctAnswer == 4){
                feedback(true, btnAnswer4);
            }else {
                feedback(false, btnAnswer4);
            }
            break;
        default: txtQuestion.setText("Error");
            break;
    }
}

public void feedback(Boolean correct, Button btn){

    if(correct){
        btn.setBackgroundColor(Color.GREEN);
        btn.setText("CORRECT!");
    }else{
        btn.setBackgroundColor(Color.RED);
        btn.setText("WRONG!");
    }

}

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

public void displayQuestion(){

    Random randomizer = new Random();

    int randomQuestion;
    int category = GTMain.choosenCategory;

    if(category == 5){
        category = randomizer.nextInt(4);
    }

    randomQuestion = randomizer.nextInt(25);

    Log.d("displayQuestion", "Before if statements");

    if(gameCategories != null && gameCategories.length != 0) {
        Log.d("displayQuestion", "First if");
        if(gameCategories[category] != null && gameCategories[category].length != 0){
            Log.d("displayQuestion", "Second if");

            txtQuestion.setText(gameCategories[category][randomQuestion].getQuestion());
            correctAnswer = gameCategories[category][randomQuestion].getCorrectAnswer();
            Log.d("displayQuestion()", "correctAnswer: " + correctAnswer);
            btnAnswer1.setText(gameCategories[category][randomQuestion].getAnswers().getA1());
            btnAnswer2.setText(gameCategories[category][randomQuestion].getAnswers().getA2());
            btnAnswer3.setText(gameCategories[category][randomQuestion].getAnswers().getA3());
            btnAnswer4.setText(gameCategories[category][randomQuestion].getAnswers().getA4());
        }
      }

   }
 }

PS:在我的主要活动中,我查看应该加载哪个片段。如果它是包含要显示问题和答案的组件的片段(上面的代码中的那个),我调用以下方法:gameFragment.launchRingDialog();(是的,我创建了一个我的GameFragment实例调用该方法之前的片段!)

1 个答案:

答案 0 :(得分:0)

当调用onResume()时,你的RestClient.get()。getQuestions(cb)仍然在后台运行,你的调用displayQuestion(),所以当然没有显示任何内容。

你可以将displayQuestion()放在回调的success()中吗?

Callback cb = new Callback<MyApiData>(){

    @Override
    public void success(MyApiData myApiData, Response response) {
        ....

        for(int i = 0; i < 4 ; i++){
            for(int j = 0; j < gameCategories[i].length ; j++){
                ...
            }
        }
        displayQuestion();

    }
    ....
};

我还建议您删除onResume()方法中的displayQuestion()。