首页 > 解决方案 > Java Android Studio 无法将 ArrayList 从另一个类发送到 MainActivity

问题描述

我尝试将数据从我的对象添加到 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());
}

输出显示如下。

Size in MainActivity
    0

Size in class MySQLConnect
83

从代码中我可以打印 computerServicesArrayList.size() 结果是 83 但是当我从 MainActivity 打印时为什么它显示结果 0。如何解决它?

标签: javaandroidarraylist

解决方案


我不Volley详细了解框架/类。但看起来您正在创建一个异步请求。因此,您的休息请求被发送,并且当响应进入您的showJSON()方法时被调用。

但是您立即返回computerServicesArrayList结果,该结果是空的,因为您还没有回复。这也是为什么您的打印语句在MainActivity您的方法打印之前执行的原因showJSON

如果你想等待休息响应,你必须做同步请求。

也许这可以帮助您更多地了解 Volley 和异步/同步请求:

但通常你会发送一个异步请求,当你得到响应时你会执行你的逻辑(更新字段,在数据库中存储一些东西,......)。


推荐阅读