簡體   English   中英

Java Android Studio 無法將 ArrayList 從另一個 class 發送到 MainActivity

[英]Java Android Studio cannot send ArrayList from another class to MainActivity

我嘗試將數據從我的 object 添加到 ArrayList 但它不起作用。

此代碼從 JSON 讀取數據,並像這樣添加到 MySQLConnect.java 中的 ArrayList 中。

    private ComputerService computerservice;
    public static ArrayList<ComputerService> computerServicesArrayList = new ArrayList<>();
    private String URL = "http://10.200.100.10/", GET_URL = "android/get_data.php";

    public MySQLConnect(){
        main = null;

    }

    public MySQLConnect(Activity mainA){
        main = mainA;
    }

    public List<ComputerService> getData(){
        String url = URL + GET_URL;
        StringRequest stringRequest = new StringRequest(url, new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
                showJSON(response);

            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Toast.makeText(main, error.getMessage().toString(), LENGTH_LONG).show();
            }
        }

        );

        RequestQueue requestQueue = Volley.newRequestQueue(main.getApplicationContext());
        requestQueue.add(stringRequest);

        return computerServicesArrayList;
    }

    public void showJSON(String response){
        String data_mysql = "";
        computerServicesArrayList.clear();
        try{
            JSONObject jsonObject = new JSONObject(response);
            JSONArray result = jsonObject.getJSONArray("data");

            for(int i=0; i < result.length(); i++){
                JSONObject collectData = result.getJSONObject(i);
                String id = collectData.getString("id");
                String type = collectData.getString("type");
                String address = collectData.getString("address");

                computerservice = new ComputerService(id, type, address);
                computerServicesArrayList.add(computerservice);

            }

        System.out.println("Size in class MySQLConnect");
        System.out.println(computerServicesArrayList.size());

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

MainActivity.java 我這樣展示了 computerServicesArrayList.size()。

 public static List<ComputerService> computerServicesArrayList;

 protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mySQLConnect = new MySQLConnect(MainActivity.this);

        update();
    }


    public void update(){
        computerServicesArrayList =  mySQLConnect.getData();
        System.out.println("Size in MainActivity");
        System.out.println(computerServicesArrayList.size());
}

output 顯示如下。

Size in MainActivity
    0

Size in class MySQLConnect
83

從代碼中我可以打印 computerServicesArrayList.size() 結果是 83 但是當我從 MainActivity 打印時為什么它顯示結果 0。如何解決它?

我不詳細了解Volley框架/類。 但看起來您正在創建一個異步請求。 因此,您的休息請求會被發送,並且當您的showJSON()方法收到響應時會被調用。

但是您立即返回了computerServicesArrayList結果,該結果為空,因為您還沒有回復。 這也是MainActivity的 print 語句在showJSON方法的 print 之前執行的原因。

如果你想等待休息響應,你必須做同步請求。

也許這可以幫助您更多地了解 Volley 和異步/同步請求:

但通常你會發送一個異步請求,當你得到響應時你會執行你的邏輯(更新字段,在數據庫中存儲一些東西,......)。

您的 computerServicesArrayList 由 Volley 的回調填充(新的 Response.Listener())。 正如您已驗證的那樣,此人口正確地發生。 但是網絡上/下旅行確實需要一些時間。 當您的 MainActivity 對 mySQLConnect.getData() 的調用返回時,此往返行程尚未完成; 所以你在 MainActivity 中得到一個空列表。

通常解決這個問題的方法是讓監聽器調用 MainActivity 中的方法。 這可以通過使

class MainActivity implements Response.Listener<String> {

/* --- */
@Override
public void onResponse(String response) {
    showJSON(response);
}

void showJSON(String response){
    // Do the stuff here
}

暫無
暫無

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

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