第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何使用 Volley 進行并發(fā) GET 調(diào)用?

如何使用 Volley 進行并發(fā) GET 調(diào)用?

炎炎設(shè)計 2023-08-04 16:37:36
我有 3 個 API GET 調(diào)用。我的方法面臨的問題是,應(yīng)用程序能夠從兩個 API 成功獲取數(shù)據(jù),并且我也能夠在 UI 上顯示它。但是,對于第三次 API 調(diào)用,由于以下錯誤,之前顯示的數(shù)據(jù)消失了,這很糟糕。D/Volley: [380] BasicNetwork.logSlowRequests: HTTP response for request=<[ ] http://example.com/api/search/getTwitterData?limit=10&tag=JavaScript 0x865f5dc2 NORMAL 3> [lifetime=6683], [size=10543], [rc=200], [retryCount=0]如何使用 Volley 進行并發(fā) API GET 調(diào)用而不丟失 UI 上的數(shù)據(jù)。有人可以指導(dǎo)我嗎?這是我的代碼的摘錄。
查看完整描述

4 回答

?
Helenr

TA貢獻1780條經(jīng)驗 獲得超4個贊

問題是您每次都會初始化適配器,這就是為什么一旦新的 API 調(diào)用您的數(shù)據(jù)就會丟失。我更喜歡下面的方法,這樣可以幫助您,在 ArrayList 中添加數(shù)據(jù)并通知適配器,


在onCreate中添加這一行,


staggeredGridAdapter = new StaggeredGridAdapter(StaggeredSearchActivity.this, dataset);

recyclerView.setAdapter(staggeredGridAdapter);

API回調(diào)響應(yīng)的變化:


                             ...


dataset.add(new StaggeredCustomCard(user, userpost, postdate));

循環(huán)后添加以下行


staggeredGridAdapter.notifyDataSetChanged();

適配器的變化


 private ArrayList<StaggeredCustomCard> dataSet;

        private Context context;


        public MyAdapter(ArrayList<StaggeredCustomCard> dataSet, Context context) {

            this.data = data;

            this.context = context;

        }

注意:不要在適配器上創(chuàng)建新對象。


查看完整回答
反對 回復(fù) 2023-08-04
?
MYYA

TA貢獻1868條經(jīng)驗 獲得超4個贊

這種方法沒有多大意義。一旦您從三個端點之一收到響應(yīng),您似乎每次都會創(chuàng)建一個新的適配器并將其附加到回收器并使用隨機的“notifyDataSetChanged”...

  1. 也許可以考慮使用具有處理業(yè)務(wù)登錄的服務(wù)層和網(wǎng)絡(luò)層的 ViewModel。

  2. 當(dāng)網(wǎng)絡(luò)方法之一的回調(diào)從端點響應(yīng)時,ViewModel 更新/發(fā)布 MutableLiveData>...合并三部分數(shù)據(jù)。

  3. 該活動只是觀察 ViewModel 的 MutableLiveData 并使用 DiffUtil 來更新回收器中的外觀/卡片。

https://img1.sycdn.imooc.com//64ccb9320001d76708640432.jpg

查看完整回答
反對 回復(fù) 2023-08-04
?
縹緲止盈

TA貢獻2041條經(jīng)驗 獲得超4個贊

最好的方法是在 onCreate 方法的 StaggeredSearchActivity 中注冊您的 LiveData 并像您一樣監(jiān)聽數(shù)據(jù)庫更改。在每個成功響應(yīng)中,將其結(jié)果保存到?jīng)]有 LiveData 的數(shù)據(jù)庫中。onCreate方法中的LiveData會被觸發(fā)。


   @Override



  protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main2);


  ViewModel viewModel = ViewModelProviders.of(this, factory).get(ViewModel.class);

            viewModel.getEntity().observe(this, entity -> {

                if (entity != null) {

                    adapter.notifyDataSetChanged(entity );


                }

            });


    requestQueue = Volley.newRequestQueue(this);


    Intent intent = getIntent();

    String searchText = intent.getStringExtra("searchText");


    // Three concurrent API GET Calls

    getMediumData(searchText);

    getExampleData(searchText);

    getGoogleData(searchText);


    recyclerView = findViewById(R.id.staggered_recycler_view);

    staggeredGridLayoutManager = new StaggeredGridLayoutManager(2, LinearLayoutManager.VERTICAL);

    recyclerView.setLayoutManager(staggeredGridLayoutManager);

}


ArrayList<StaggeredCustomCard> dataset = new ArrayList<>();


private void getMediumData(String searchText) {

    progressBar = findViewById(R.id.progressBar);

    progressBar.setVisibility(View.VISIBLE);


    String url = UrlConstants.getUrl() + searchText;


    JsonObjectRequest jsonObjectRequest = new JsonObjectRequest

            (Request.Method.GET, url, null, new Response.Listener<JSONObject>() {




                   @Override

                    public void onResponse(JSONObject response) {

                        StaggeredCustomCardDAO.insert();

                        // TODO just insert to dataBase

                    }


                }, new Response.ErrorListener() {

                    @Override

                    public void onErrorResponse(VolleyError error) {

                        // TODO: Handle error

                        progressBar.setVisibility(View.INVISIBLE);

                    }

                });


        jsonObjectRequest.setRetryPolicy(new


                DefaultRetryPolicy(

                DefaultRetryPolicy.DEFAULT_TIMEOUT_MS * 15,

                DefaultRetryPolicy.DEFAULT_MAX_RETRIES,

                DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));

        requestQueue.add(jsonObjectRequest);

    }


    private void getExampleData(String searchText) {



        JsonArrayRequest jsonArrayRequest = new JsonArrayRequest

                (Request.Method.GET, url, null, new Response.Listener<JSONArray>() {


                    @Override

                    public void onResponse(JSONArray response) {

                        try {


                            // TODO just insert to dataBase

                          StaggeredCustomCardDAO.insert();

                        } catch (

                                JSONException e) {

                            e.printStackTrace();

                        }

                    }

                }, new Response.ErrorListener() {

                    @Override

                    public void onErrorResponse(VolleyError error) {


                    }

                });


        jsonArrayRequest.setRetryPolicy(new DefaultRetryPolicy(

                DefaultRetryPolicy.DEFAULT_TIMEOUT_MS * 15,

                DefaultRetryPolicy.DEFAULT_MAX_RETRIES,

                DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));

        requestQueue.add(jsonArrayRequest);

    }


    private void getGoogleData(String searchText) {



        JsonObjectRequest jsonObjectRequest = new JsonObjectRequest

                (Request.Method.GET, url, null, new Response.Listener<JSONObject>() {


                    @Override

                    public void onResponse(JSONObject response) {


                        // TODO just insert to dataBase

StaggeredCustomCardDAO.insert();

                    }

                }, new Response.ErrorListener() {

                    @Override

                    public void onErrorResponse(VolleyError error) {


                    }

                });


        jsonObjectRequest.setRetryPolicy(new DefaultRetryPolicy(

                DefaultRetryPolicy.DEFAULT_TIMEOUT_MS * 15,

                DefaultRetryPolicy.DEFAULT_MAX_RETRIES,

                DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));

        requestQueue.add(jsonObjectRequest);



    }



    class ViewModel extends androidx.lifecycle.ViewModel {



        private LiveData<StaggeredCustomCard> entity;



        public ViewModel(Repository repository) {

            entity = repository.getNetworkData();

        }



        public LiveData<StaggeredCustomCard> getEntity() {

            return entity;

        }

    }


    class Repository {


        LiveData<StaggeredCustomCard> getNetworkData() {


            LiveData<StaggeredCustomCard> localeData =  StaggeredCustomCardDAO .getLocaleData();//... todo Read from data base

            return localeData;

        }

    @Dao

    public interface StaggeredCustomCardDAO {

        @Query("Select * from tbl_staggeredCustomCard ")

        LiveData<StaggeredCustomCard> getLocaleData();


        @Insert(onConflict = OnConflictStrategy.REPLACE)

        void insert(List<StaggeredCustomCard> items);


    }

    }



查看完整回答
反對 回復(fù) 2023-08-04
?
達令說

TA貢獻1821條經(jīng)驗 獲得超6個贊

第一種方法:首先我建議您創(chuàng)建一個中央請求隊列。


public class AppController extends Application {

    public static final String TAG = AppController.class

            .getSimpleName();

    private RequestQueue mRequestQueue;


    private static AppController mInstance;


    @Override

    public void onCreate() {

        super.onCreate();

        mInstance = this;

    }


    public static synchronized AppController getInstance() {

        return mInstance;

    }


    public RequestQueue getRequestQueue() {

        if (mRequestQueue == null) {

            mRequestQueue = Volley.newRequestQueue(getApplicationContext());

        }


        return mRequestQueue;

    }


    public <T> void addToRequestQueue(Request<T> req, String tag) {

        // set the default tag if tag is empty

        req.setTag(TextUtils.isEmpty(tag) ? TAG : tag);

        getRequestQueue().add(req);

    }


    public <T> void addToRequestQueue(Request<T> req) {

        req.setTag(TAG);

        getRequestQueue().add(req);

    }


    public void cancelPendingRequests(Object tag) {

        if (mRequestQueue != null) {

            mRequestQueue.cancelAll(tag);

        }

    }

}

然后將您想要的請求添加到隊列中


// Adding request to request queue

AppController.getInstance().addToRequestQueue(jsonObjReq);

第二種方式:創(chuàng)建一個Generic Volley類和一個接口,使用接口來獲取成功和失敗響應(yīng)。


步驟 1 創(chuàng)建一個單獨的 Volley 類 步驟 2 創(chuàng)建一個用于訪問 volley 類響應(yīng)的接口 步驟 3 為該類創(chuàng)建新對象并發(fā)送所需參數(shù) new PostVolleyJsonRequest(TestVolley.this, TestVolley.this(interfcae), "Submit", url ,參數(shù));


類的上下文 用于發(fā)送成功和失敗響應(yīng)的接口 成功時識別的請求類型 url(強制) GET 的參數(shù)(可選) 不需要 通用 volley 類


public class PostVolleyJsonRequest {

private String  type;

private Activity act;

private VolleyJsonRespondsListener volleyJsonRespondsListener;

private String networkurl;

private JSONObject jsonObject = null;

private JSONObject params;



public PostVolleyJsonRequest(Activity act, VolleyJsonRespondsListener volleyJsonRespondsListener, String type, String netnetworkUrl,JSONObject params) {

    this.act = act;

    this.volleyJsonRespondsListener = volleyJsonRespondsListener;

    this.type = type;

    this.networkurl = netnetworkUrl;

    this.params = params;

    sendRequest();

}


private void sendRequest() {


    Log.d("url", "url" + networkurl);

    JsonObjectRequest jsObjRequest = new JsonObjectRequest(Request.Method.POST,networkurl,params,

            new Response.Listener<JSONObject>() {

                @Override

                public void onResponse(JSONObject response) {

                    Log.e("response", "response " + response);

                    volleyJsonRespondsListener.onSuccessJson(response, type);

                }

            },

            new Response.ErrorListener() {

                @Override

                public void onErrorResponse(VolleyError error) {

                    try {

                        NetworkResponse response = error.networkResponse;

                        Log.e("response", "response " + response);

                        if (response != null) {

                            int code = response.statusCode;


                            String errorMsg = new String(response.data);

                            Log.e("response", "response" + errorMsg);

                            try {

                                jsonObject = new JSONObject(errorMsg);

                            } catch (JSONException e) {

                                e.printStackTrace();

                            }

                            String msg = jsonObject.optString("message");

                            volleyJsonRespondsListener.onFailureJson(code, msg);

                        } else {

                            String errorMsg = error.getMessage();

                            volleyJsonRespondsListener.onFailureJson(0, errorMsg);

                        }

                    } catch (Exception e) {

                        e.printStackTrace();

                    }

                }

            });


    jsObjRequest.setRetryPolicy(new DefaultRetryPolicy(

            600000,

            DefaultRetryPolicy.DEFAULT_MAX_RETRIES,

            DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));


    RequestQueue requestqueue = Volley.newRequestQueue(act);

    requestqueue.add(jsObjRequest);


}

}


Use the interface to get responds message


public interface VolleyJsonRespondsListener {


public void onSuccessJson(JSONObject result, String type);

public void onFailureJson(int responseCode, String responseMessage);

}

在您想要包含多個請求的班級中


public class TestVolley extends AppCompatActivity implements VolleyJsonRespondsListener{


//Your class code goes here



//network request


try {

        //parameters 

        //Context,Interface,Type(to indentify your responds),URL,parameter for your request 


        //request 1

        new PostVolleyJsonRequest(TestVolley.this, TestVolley.this, "Submit", url, params);


        //request 2

        new PostVolleyJsonRequest(TestVolley.this, TestVolley.this, "AccessData", url_2, params_2);





 } catch (Exception e) {


 e.printStackTrace()

 }


 //Methods from Interface


  @Override

public void onSuccessJson(JSONObject result, String type) {


   //Based on the Type you send get the responds and parse it 

    switch (type) {

        case "Submit":

            try {

                parseSubmit(result);

            } catch (Exception e) {



查看完整回答
反對 回復(fù) 2023-08-04
  • 4 回答
  • 0 關(guān)注
  • 173 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號