改进2异步调用返回响应

时间:2015-11-24 20:45:51

标签: android asynchronous android-asynctask httprequest retrofit

我正在使用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,因为永远不会等待响应完成,有人可以帮助我吗?。

2 个答案:

答案 0 :(得分:0)

你不能混合同步方法调用和异步回调 - 一旦你输入Callback - 你必须留在那里。

调用getRoundList()的代码(可能在某些ActivityFragment中)然后使用返回的值执行某些操作,对吗?而不是仅将身体存储到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);

瞧,它有效。