簡體   English   中英

靜態變量不會改變並被替換為“”

[英]Static variable doesn't change and get replaced with " "

我的應用程序是一個簡單的單詞拼圖游戲,因此它的級別是從 Json Web 服務中獲取的,使用AsyncTask類我可以在doInBackgroundonPostExecute方法中獲取數據,我在FetchData類中使用局部變量來保存獲取的數據數據輸入,數據只是6個字符串,分別是圖片URL和關卡id,還有4個字是按鈕,這里是游戲界面,你可以看到有4個按鈕每個都有一個字,玩家必須通過查看圖片找到它。

因此,當玩家找到例如 1 個單詞並離開應用程序並關閉它時,必須保存玩家找到的單詞,當他返回LevelActivity他應該通過找到更多 3 個單詞來繼續關卡。

問題:當我關閉應用程序並返回時,當我找到一個單詞並且該單詞顯示(因此必須保存)時會發生這種情況,根據我的測試,我發現那些影響數據滯后的代碼行

注意:每當我(手動)重新加載活動時,一切都會變好,而不是在重新創建活動后出現一個空按鈕,該詞顯示。

使用的數據獲取方法: onCreate & onResume

//This is in LevelActivity.java:

//These methods checks if the button is answered previously or not (button1/button2... variables are true when a word is answered)

  public void checkButton1() {

        if (button1) {
            wordButton1.setText(button1Word); //<--- Here if I changed it to .setText("Test") 
          //the lag will disappear and the button will show "Test" (without the quotation) and everything's good
          //So the problem is when I use .setText(button1Word); that is the word fetched from Json web service.
          //it doesn't throw NullPointerException and it doesn't show the word
          //but what? it set the text to " "? Why?

          //Note other buttons are the same thing too

        }

    }

    public void checkButton2() {

        if (button2) {
            wordButton2.setText(button2Word);
        }
    }

    public void checkButton3() {

        if (button3) {
            wordButton3.setText(button3Word);
        }
    }

    public void checkButton4() {

        if (button4) {
            wordButton4.setText(button4Word);
        }
    }

//This is FetchData class that fetches the data from Json web service (full code)

package com.example.wordspuzzlejsontest;

import android.content.Context;
import android.os.AsyncTask;
import com.squareup.picasso.Picasso;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

public class FetchData extends AsyncTask<Void, Void, Void> {

//Local variable that are used to hold fetched data to transfer them to LevelActivity with static variables
    static int currentLevel = 0;
    String w1;
    String w2;
    String w3;
    String w4;
    String data = "";
    String id;
    String img;
    Context context;

    @Override
    protected Void doInBackground(Void... voids) {
        try {
            URL url = new URL("https://api.jsonbin.io/b/5e42776dd18e4016617690ce/7");
            HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
            InputStream inputStream = httpURLConnection.getInputStream();
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
            String line = "";
            while (line != null) {
                line = bufferedReader.readLine();
                data = data + line;
            }

            JSONArray JA = new JSONArray(data);

            JSONObject JO = (JSONObject) JA.get(currentLevel);

            id = (String) JO.get("id");
            img = (String) JO.get("img");
            w1 = (String) JO.get("w1");
            w2 = (String) JO.get("w2");
            w3 = (String) JO.get("w3");
            w4 = (String) JO.get("w4");


        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (JSONException e) {
            e.printStackTrace();
        }

        return null;
    }

    @Override
    protected void onPostExecute(Void aVoid) {
        super.onPostExecute(aVoid);

        int levelId = Integer.parseInt(id);
        levelId++;

        //Loading the words data to buttons
        LevelActivity.levelID = String.valueOf(levelId);
        LevelActivity.imageURL = img;
        LevelActivity.button1Word = w1;
        LevelActivity.button2Word = w2;
        LevelActivity.button3Word = w3;
        LevelActivity.button4Word = w4;

        //Loading level image and level number on the screen
        LevelActivity.levelIdTextView.setText(LevelActivity.levelID);
        loadLevelImage();
    }

    public void loadLevelImage() {

        Picasso.with(context).load(LevelActivity.imageURL).placeholder(R.drawable.loading)
                .error(R.drawable.loading)
                .into(LevelActivity.imageView, new com.squareup.picasso.Callback() {

                    @Override
                    public void onSuccess() {

                    }

                    @Override
                    public void onError() {

                    }
                });
    }

}

感謝您查看我的回答 :D 如果您需要任何其他代碼,請告訴我。

onPostExecute()調用結束時

checkButton1()
checkButton2()
checkButton3()
checkButton4()

缺失。 因此,按鈕無法知道新值,因此保持為空。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM