如何从 Retrofit 的 onResponse 函数返回值并在其他过程中调用它?

Posted

技术标签:

【中文标题】如何从 Retrofit 的 onResponse 函数返回值并在其他过程中调用它?【英文标题】:How to return value from function onResponse of Retrofit and call it in other procedure? 【发布时间】:2018-09-17 06:18:25 【问题描述】:

我是改装新手,我想创建我的 getData 列表以保存 onResponse 正文列表中的值并在不同的过程中调用它。最简单的方法是什么? 我一直在尝试,数据已经显示在 onResponse 但是当我想在不同的过程中使用它时,值 getData 列表仍然为空

我的 onCreate

@Override
public void onCreate(@Nullable Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
   // getDataSeason();
    listSeason=new ArrayList<>();
    progress = new ProgressDialog(getActivity());
    progress.setCancelable(false);
    progress.setMessage("Loading. . .");
    progress.show();

    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(getURL.GetMyURL())
            .addConverterFactory(GsonConverterFactory.create())
            .build();
    SeasonAPI api = retrofit.create(SeasonAPI.class);

    Call<SeasonList> call = api.getAllSeason();
    call.enqueue(new Callback<SeasonList>() 
        @Override
        public void onResponse(Call<SeasonList> call, Response<SeasonList> response) 
            progress.dismiss();
            response.body();
            for(int i=0;i<response.body().getResult().size();i++)
                getData.add(i,response.body().getResult().get(i));
            
        

        @Override
        public void onFailure(Call<SeasonList> call, Throwable t) 
            t.printStackTrace();
            progress.dismiss();
            Toast.makeText(getActivity(),"Network Connection Error",Toast.LENGTH_SHORT).show();
        

    );

字符串温度

我的 getData 列表

public class FragmentPromo extends Fragment 

public List<Season> getData;

我的赛季列表

public class SeasonList 
@SerializedName("value")
@Expose
private Integer value;
@SerializedName("result")
@Expose
private List<Season> result = null;

public Integer getValue() 
    return value;


public void setValue(Integer value) 
    this.value = value;


public List<Season> getResult() 
    return result;


public void setResult(List<Season> result) 
    this.result = result;

当我想在 oncreateView 中显示 getData 值时它为空

public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) 
    // Inflate the layout for this fragment
    View view= inflater.inflate(R.layout.fragment_promo,container,false);
    //Set date in Text View
    txtDate=(TextView)view.findViewById(R.id.txtDateTime);
    txtDate.setText(currendtDateTimeString);

    myRecycleView=(RecyclerView)view.findViewById(R.id.season_view);
    recycleViewAdapterSeason =new RecycleViewAdapterSeason(getContext(),listSeason);
    myRecycleView.setLayoutManager(new LinearLayoutManager(getActivity()));
    myRecycleView.setAdapter(recycleViewAdapterSeason);
    getDataSeason();
    Toast.makeText(getActivity(),getData.get(0).getNamaSeason(),Toast.LENGTH_SHORT).show();

    return view;

【问题讨论】:

你的模型类或 SeasonList 在哪里? 具体来说,null是哪个值?分享它为空的代码 我已经更新了 你能更新设置listSeason的代码吗? 【参考方案1】: 首先,在处理 Retrofit 时,最好创建一个 Singleton 类,您可以阅读此设计模式以及它在内存管理方面的帮助 其次,在 onResponse() 为什么你在循环之前调用 response.body() 而没有使用它? 你得到一个空指针异常,因为你想使用一个列表而不初始化它 您所要做的就是从 SesaonList 类中创建一个对象并将其值分配给您的响应,getData 将通过调用 getResult ,这应该可以工作

@Override public void onResponse(Call<SeasonList>call,Response<SeasonList>response) progress.dismiss(); Seasonlist seasonlist = response.body(); getData = seasonlist.getResult();

【讨论】:

以上是关于如何从 Retrofit 的 onResponse 函数返回值并在其他过程中调用它?的主要内容,如果未能解决你的问题,请参考以下文章

JSON onResponse - 列表不会填充数据

尝试通过列表视图显示数据时应用程序崩溃

如何确保 onResponse 的执行顺序与请求的顺序相同?

如何返回改造时使用的方法OnResponse的列表?

Volley Post 请求在 onResponse 内没有返回响应

如何从 Retrofit2 获得字符串响应?