是否在响应之外访问改造2数据?

时间:2019-06-12 07:08:29

标签: list retrofit2

我正在开发两个应用程序,其中一个应用程序“ A”应用了改造2。

这是我用来检索数据的方法。

但是在这里,在“响应”中,可以将在响应主体中检索到的数据设置为活动变量,并且可以在此方法之外使用而无需获取空值。

  public void fetch_information() {
            ApiInterface = ApiClient.getApiClient().create(Api.class);

            Call<List<City>> call = ApiInterface.GetCities();


            call.enqueue(new Callback<List<City>>() {
                @Override
                public void onResponse(Call<List<City>> call, Response<List<City>> response) {
                    citylist = new ArrayList<City>();
                    citylist = response.body();  
                    cities = new String[citylist.size()];
                    citiesid = new String[citylist.size()];
                    for (int i = 0; i < citylist.size(); i++) {
                        cities[i] = citylist.get(i).getCityName();
                        citiesid[i] = citylist.get(i).getCityId();


                    }

                    city_adapter = new ArrayAdapter<String>(Pay_Payment_X.this, android.R.layout.simple_list_item_1, cities);
                    city_adapter.setDropDownViewResource(R.layout.spinner_dropdown_layout);
                    City_Spinner.setAdapter(city_adapter);


                }


                @Override
                public void onFailure(Call<List<City>> call, Throwable t) {
                    Toast.makeText(getApplicationContext(), t.getMessage(), Toast.LENGTH_SHORT).show();
                }
            });

        }

应用此方法并调试该方法后,我将在Response的外部保留变量“ cities”和“ citysid”的值。

但是类似地将改造2应用于另一个应用程序“ B”,我做了同样的事情来检索不同URL上的数据。

ApiUtil.getServiceClass().getAllPost().enqueue(new Callback<List<ApiObject>>() {

                @Override
                public void onResponse(Call<List<ApiObject>> call, Response<List<ApiObject>> response) {
                    if (response.isSuccessful()) {
                        List<ApiObject> postList = response.body();


                            try {

                                for (int i = 0; i < postList.size(); i++) {
                                    String Name = postList.get(i).getGamesName();
                                    mGamesName.add(Name);
                                }
                            } catch (Exception e) {
                            }

                        Log.d(TAG, "Returned count " + postList.size());
                        NewAdapter adapter = new NewAdapter(getApplicationContext(), postList);
                        recyclerView.setAdapter(adapter);
                    }
                }

                @Override
                public void onFailure(Call<List<ApiObject>> call, Throwable t) {
                    //showErrorMessage();
                    Log.d(TAG, "error loading from API");
                }

            });

在onResponse内部可以检索数据,但在外部显示为空。 因此,这里的变量不保留值。

为什么会这样?

唯一想到的是,在读取代码行时检索数据可能会花费一些时间,并且由于尚未收到数据而查找空值。

还要提及在应用程序“ A”中检索到的数据巨大,但在应用程序“ B”中仅包含3个具有字符串值的对象。但是在应用程序“ A”中仍可检索到数据。

在应用2中,这样做是为了解决我的问题。

public void doRequest( final ApiCallback callback){

        ApiUtil.getServiceClass().getAllPost().enqueue(new Callback<List<ApiObject>>() {

            @Override
            public void onResponse(Call<List<ApiObject>> call, Response<List<ApiObject>> response) {
                if (response.isSuccessful()) {
                    List<ApiObject> postList = response.body();
                    callback.onSuccess(postList);
                    // apobject =response.body();
                    if(response.isSuccessful()) {
                        try {

                            for (int i = 0; i < postList.size(); i++) {
                                String Name = postList.get(i).getGamesName().toString();
                                mGamesName.add(Name);
                            }
                        } catch (Exception e) {
                        }
                    }
                    Log.d(TAG, "Returned count " + postList.size());
                    NewAdapter adapter = new NewAdapter(getApplicationContext(), postList);
                    recyclerView.setAdapter(adapter);
                }
            }

            @Override
            public void onFailure(Call<List<ApiObject>> call, Throwable t) {
                //showErrorMessage();
                Log.d(TAG, "error loading from API");
            }

        });


    }

通过界面

 public interface ApiCallback{
        void onSuccess(List<ApiObject> result);
    }

在“创建活动的视图”中,我称之为

 doRequest(new ApiCallback(){
            @Override
            public void onSuccess(List<ApiObject> result){
                //here i can set variable values
            }
        });

1 个答案:

答案 0 :(得分:0)

  

唯一想到的是,在读取代码行时检索数据可能会花费一些时间,并且由于尚未收到数据而查找空值。

完全正确。检查值后,通话结束。我在这里要说的是巧合,它可以在一个应用程序上运行而不是在另一个应用程序上运行(如果他们实际上是以相同的方式运行的话)

致电callback.onSuccess(postList);似乎也不正确,因为您尚未检查是否成功。这意味着response.body()可能是null,而response.errorBody()将包含错误的正文。

如果您将callback.onSuccess移到if内,将得到解决:

if(response.isSuccessful()) {
    callback.onSuccess(response.body());
    try {
            for (int i = 0; i < postList.size(); i++) {
                String Name = postList.get(i).getGamesName().toString();
                mGamesName.add(Name);
             }
    } catch (Exception e) {
 }

最后但并非最不重要的一点是,在onSuccess方法中可以使用全局变量的时间。也许最好停止使用全局变量,而只使用回调参数。