Volley 首次加载活动时显示空错误

Posted

技术标签:

【中文标题】Volley 首次加载活动时显示空错误【英文标题】:Volley shows null error when activity loads first time 【发布时间】:2019-03-25 00:54:12 【问题描述】:

我的 android 活动中有视图寻呼机,并使用 NodeJs 和 MongoDb 作为后端服务。当我的活动第一次开始时,它显示 volley error null 当我停止我的应用程序并重新启动它时,它会在视图寻呼机中加载图像并且工作正常。 为什么第一次开始活动时它没有从服务器获取数据。

这是我的代码:

MainActivity.java

public class MainActivity extends AppCompatActivity 

ViewPager viewPager;
TabLayout tab;

RequestQueue rq;
List<Model> list;
Adapter adapter;

String request_url = "https://example.com";


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

    rq = CustomRequest.getInstance(MainActivity.this).getRequestQueue();

    viewPager = findViewById(R.id.viewPager);
    tab = findViewById(R.id.tabLayout);

    list = new ArrayList<>();

    tab.setupWithViewPager(viewPager, true);

    final ProgressDialog prg = new ProgressDialog(MainActivity.this);
    prg.setMessage("Loading");
    prg.show();

    StringRequest stringRequest = new StringRequest(Request.Method.POST, request_url, new Response.Listener<String>() 
        @Override
        public void onResponse(String response) 

            prg.dismiss();

            try 
                JSONArray jsonArr  = new JSONArray(response);

                for (int i = 0; i < jsonArr.length(); i++) 

                    Model model = new Model();

                    JSONObject jsonObject = jsonArr.getJSONObject(i);

                    model.setImage(jsonObject.getString("Image"));

                    list.add(model);

                

                adapter = new Adapter((ArrayList<Model>) list, MainActivity.this);

                viewPager.setAdapter(adapter);

             catch (JSONException e) 
                e.printStackTrace();
            
        
    , new Response.ErrorListener() 
        @Override
        public void onErrorResponse(VolleyError error) 

            prg.dismiss();

            Toast.makeText(getApplicationContext(),""+error.getMessage(),Toast.LENGTH_SHORT).show();
        
    )

        @Override
        protected Map<String, String> getParams() throws AuthFailureError 

            HashMap<String,String> params = new HashMap<>();

            params.put("place","Ajmer");

            return params;
        
    ;

    CustomRequest.getInstance(MainActivity.this).addToRequetQueue(stringRequest);
 

Adapter.java

public class Adapter extends PagerAdapter 

ArrayList<Model> list = new ArrayList<>();
Context context;
LayoutInflater layoutInflater;

public Adapter(ArrayList<Model> list, Context context) 
    this.list = list;
    this.context = context;


@Override
public int getCount() 
    return list.size();


@Override
public boolean isViewFromObject(@NonNull View view, @NonNull Object o) 
    return view == o;


@NonNull
@Override
public Object instantiateItem(@NonNull ViewGroup container, final int position) 

    layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    assert layoutInflater != null;
    View view = layoutInflater.inflate(R.layout.custom, null);

    Model model =  list.get(position);

    ImageView imageView = view.findViewById(R.id.imageView);

    Glide.with(context).load(model.getImage()).into(imageView);

    ViewPager vp = (ViewPager) container;
    vp.addView(view, 0);
    return view;


@Override
public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) 

    container.removeView((LinearLayout)object);
 

请有人告诉我为什么会遇到这个问题。

谢谢

【问题讨论】:

【参考方案1】:

您是否初始化了 RequestQueue。如果不是,请在字符串请求之前添加以下代码

RequestQueue queue = Volley.newRequestQueue(context);

在该调用之后添加 queue.add 在字符串请求调用之后

queue.add(stringRequest);

如果错误仍然存​​在... 打印 volley 的响应是否为空。

【讨论】:

是的,我试过了,但第一次开始活动时仍然显示 null。我使用的是 volley singleton 模式。

以上是关于Volley 首次加载活动时显示空错误的主要内容,如果未能解决你的问题,请参考以下文章

蜂巢表在显示数据时显示空输出

从数据库中获取记录时显示空表视图

JSON NSDictionary 在输出到日志时显示空描述

单击搜索结果时显示空的详细信息视图

尝试显示从服务器对象检索到的值时显示空值

DataGridView 绑定到已键入的 DataTable 时显示空单元格