如何处理来自 volley onResponse 方法的网络访问

问题描述

我正在尝试通过从 api 服务器获取指令来构建一个底部导航栏。

*当前代码抛出 [java.lang.IllegalStateException],因为它从 onResponse 方法调用 Picasso。

void updateMenuItems(RequestQueue queue,Menu menu){
    String url = "http://10.0.2.2:5000/api/menuIcons";

    //Request a string response from the provided URL
    JsonArrayRequest jsonArrRequest = new JsonArrayRequest (Request.Method.GET,url,null,new Response.Listener<JSONArray>(){
        @Override
        public void onResponse(JSONArray response) {
            Log.e("updateMenu",response.toString());

            List<MenuItems> menuItemsList = new ArrayList<MenuItems>();

            for(int i = 0; i<response.length(); i++){
                try {
                    JSONObject jsonItem = response.getJSONObject(i);
                    String imageLink = jsonItem.getString("image");

                    menu.add(0,jsonItem.getInt("id"),jsonItem.getString("name")).setIcon(new BitmapDrawable(getResources(),Picasso.get().load(imageLink).get()));

                } catch (JSONException | IOException e) {
                    e.printstacktrace();
                }
            }
        }
    },new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            Log.e("updateMenu","response error");
        }
    });

    queue.add(jsonArrRequest);
}

服务器发送的JSON文件如下

app.get('/api/menuIcons',(req,res) => {
  res.send([
    {
      'id': 1,'name': 'Home','url': 'http://10.0.2.2:3000/','image': "https://upload.wikimedia.org/wikipedia/commons/thumb/e/e6/Home_Icon.svg/1200px-Home_Icon.svg.png"
    },{
      'id': 2,'name': 'Dashboard','url': 'http://google.com/',{
      'id': 3,'name': 'Alarm','url': 'https://google.com/',{
      'id': 4,'name': 'Setting','image': "https://upload.wikimedia.org/wikipedia/commons/thumb/e/e6/Home_Icon.svg/1200px-Home_Icon.svg.png"
    }
  ]);
});

问题来了。我可以通过一个 Volley 请求添加没有图标的菜单项。 但是,要将图像图标添加菜单项,我需要访问图像 URL,这需要另一个异步线程。

我不想在 volley call 中声明另一个 volley call(它只是乱七八糟)。 我想知道是否有结构上更好的解决方案。

解决方法

我注意到不允许来自 onResponse 方法的网络连接,因为 onResponse 方法在 UI 线程中运行。相反,我实施了 请求 类并在其中修改了 parseNetworkResponse。由于 parseNetworkResponse 在单独的线程中运行,因此我可以在该函数内运行其他同步网络请求。