在第一个功能完全执行之前执行第二个功能

时间:2019-05-03 13:13:26

标签: java android android-recyclerview android-volley

我有两个函数fetchData()和setDataUI(),在fetchData()中,我正在发送请求并保存响应。在setDataUI()函数中,我正在设置适配器以绑定数据的。

conv_group

fetchData2()从服务器获取数据。

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

        recyclerView = (RecyclerView) findViewById(R.id.image_recycler_view);
        data_list = new ArrayList<>();

        fetchData2(1);
}

然后在setDataUI()

public void fetchData2(final int next){
        String url = Constants.URL+"image/gallery?page="+next;
        Log.d(TAG,"Data2 Url-->"+url);
        StringRequest stringRequest = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
                try {
                    Log.d(TAG, "Response-->" + response);
                    JSONObject jsonObject = new JSONObject(response);
                    JSONArray jsonArray = jsonObject.getJSONArray("media");
                    Log.d(TAG, "Media Array-->" + jsonArray);
                    for (int i = 0; i < jsonArray.length(); i++) {
                        JSONObject jsonObject1 = jsonArray.getJSONObject(i);

                        ImageGallery imageGallery = new ImageGallery(
                                jsonObject1.getString("file"),
                                jsonObject1.getString("description"),
                                jsonObject.getInt("next"));

                        data_list.add(imageGallery);

                        Log.d(TAG, "Data List in AsyncTask-->" + data_list);
                        setDataUI();

                    }
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Toast.makeText(ActivityImageGallery.this, "Server Error!!!!", Toast.LENGTH_SHORT).show();
            }
        });

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

预期结果: 函数setDataUI()必须仅在fetchData2()完全完成执行时启动。因此,setDataUI()中的data_list将具有在fetchData2()中初始化的值。

实际结果: 当前setDataUI()在fetchData2()完成执行之前开始执行,导致data_list在setDataUI()中为空。

在执行setDataUI()之后,我确实从服务器获得了正确的响应。

3 个答案:

答案 0 :(得分:1)

您需要做的只是在响应方法中进行如下更改

            @Override
            public void onResponse(String response) {
                try {
                    if(response.isSuccessful){
                    Log.d(TAG, "Response-->" + response);
                    JSONObject jsonObject = new JSONObject(response);
                    JSONArray jsonArray = jsonObject.getJSONArray("media");
                    Log.d(TAG, "Media Array-->" + jsonArray);
                    for (int i = 0; i < jsonArray.length(); i++) {
                        JSONObject jsonObject1 = jsonArray.getJSONObject(i);

                        ImageGallery imageGallery = new ImageGallery(
                                jsonObject1.getString("file"),
                                jsonObject1.getString("description"),
                                jsonObject.getInt("next"));

                        data_list.add(imageGallery);

                        Log.d(TAG, "Data List in AsyncTask-->" + data_list);
                        }
                       setDataToUI();
                    }
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }

-放置setDataToUI();在onresponse中完成for循环后的方法调用。 -另外,您的第二个方法要比第一个方法先执行,因为您的第一个方法是异步的(即正在另一个线程上工作。它不在主线程或UI线程中执行)。

答案 1 :(得分:0)

排球的请求是异步的。因此,您应该从回调中调用setDataToUI

 StringRequest stringRequest = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
                 // all your code

                 runOnUiThread(new Runnable() {
                         @Override
                         public void run() {
                               setDataToUI();
                         }
                   }
        } 

答案 2 :(得分:0)

这是因为您的fetchData()异步任务在后台运行,因此您无法预测将花费多少时间。因此,与其在setDataToUI()函数之后调用fetchData2(),还不如在fetchData2()函数的响应内调用它。您可以在fetchData2函数中对此进行编辑

data_list.add(imageGallery); Log.d(TAG, "Data List in AsyncTask-->" + data_list); setDataToUI()