我正在使用Retrofit做一个Android应用程序,我遇到的问题是我需要从Callback返回response.body(),这是我的代码:
public class RoundListProvider {
//Load Rounds
private static RoundsInterface roundClient = RetroBuilder.createService(RoundsInterface.class);
private static RoundList mRoundList;
public static RoundList getRoundList(final Context mContext)
{
Toast.makeText(mContext, "We're in", Toast.LENGTH_LONG).show();
//Fetch info from rounds
Call<RoundList> call = roundClient.getRounds();
call.enqueue(new Callback<RoundList>() {
@Override
public void onResponse(Response<RoundList> response, Retrofit retrofit) {
Log.d("BODY", response.body().toString());
Log.d("MESSAGE", response.message());
Toast.makeText(mContext, "Conexión al servidor hecha con exito", Toast.LENGTH_LONG).show();
mRoundList = response.body();
}
@Override
public void onFailure(Throwable t) {
Log.d("BODY", t.getMessage());
Log.d("ERRRO", t.getStackTrace().toString());
}
});
return mRoundList;
}
}
你可以想象,返回mRoundList总是为null,因为永远不会等待响应完成,有人可以帮助我吗?。
答案 0 :(得分:0)
你不能混合同步方法调用和异步回调 - 一旦你输入Callback
- 你必须留在那里。
调用getRoundList()
的代码(可能在某些Activity
或Fragment
中)然后使用返回的值执行某些操作,对吗?而不是仅将身体存储到mRoundList
中的onResponse
- 用你那里的值做你想要的事情。
答案 1 :(得分:0)
嗯,问题是我需要在Recycler View中使用响应数据,所以我这样做了,也许不是最好的,但它确实有效。在我的提供者中,我添加了一个新功能:
public static void savedRoundList(RoundList roundList, Activity activity, Context context)
{
RecyclerView recyclerView = (RecyclerView) activity.findViewById(R.id.rvRounds);
recyclerView.setHasFixedSize(true);
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(activity);
recyclerView.setLayoutManager(linearLayoutManager);
List<RoundData> roundData = roundList.getRounds();
RoundAdapter adapter = new RoundAdapter(roundData);
Log.d("RESPONSE & ERROR", roundList.getStatus()+ " "+ roundList.getCode());
recyclerView.setAdapter(adapter);
}
所以,在Callback中我只是函数savedRoundList:
savedRoundList(response.body(), mActivity, mContext);
瞧,它有效。