【问题标题】:Two-Dimensional Array with JSON data - Data is downloaded, but I can't access it (?)带有 JSON 数据的二维数组 - 数据已下载,但我无法访问它(?)
【发布时间】:2015-03-24 02:15:39
【问题描述】:

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

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

这里的问题是,显然我的数组要么为空,要么它们的长度为零。这很奇怪,因为根据我的日志,数据正在通过回调方法传递给这些数组。

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

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 片段的实例! )

【问题讨论】:

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


    【解决方案1】:

    当 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()。

    【讨论】:

    • 这确实使它有点工作,但现在有两个问题:我告诉它甚至在用户选择类别之前显示信息(这意味着正确的答案,问题本身都是错误的)。这让我回到每当我打开那个片段时,它仍然有上次的内容(这就是我试图在 onResume 方法中调用 displayQuestion 的原因)
    • 太棒了!由于您只想在用户选择类别后调用 displayQuestion() 并且您想等到 API 调用完成,我建议您在调用 RestClient.get().getQuestions(cb) 之前显示一个加载对话框然后在 onSuccess() 方法中关闭对话框。这样,在您获取数据时,您的用户将无法与您的应用进行交互。然后你会想把 displayQuestion() 方法放在你的按钮 onclicklistener 中。
    • 我尝试了一些东西,但我无法让它工作......我被卡住了!如果我将 RestClient.get().getQuestions(cb) 放在 onCreateView 方法上,它会被调用一次,之后不会更新(但至少它可以工作一次) - 如果我把它放在其他任何地方,就好像它从未被调用过,并且它不起作用。我正在使用进度对话框的小东西更新代码......关于为什么会发生这种情况的任何想法? ps:我有一个叫做categories的fragment,里面是用户选择一个category的地方,然后这个fragment被加载出来显示问题和答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-25
    • 1970-01-01
    相关资源
    最近更新 更多