如何在同一片段中创建多个Retrofit回调-Android

RubyDigger19

我正在尝试在片段中实现多个按钮,每个按钮都需要从Web API获取一些数据。

我已经为一个按钮创建了改造回调。现在,我在创建另一个按钮以从另一个api获取数据时遇到了一些麻烦。

这是我的界面:

public interface APIService {

        @GET("/api/partners.json")
        Call<List<Partner>> getPartners();

        @GET("/api/drivers.json")
        Call<List<Driver>> getDrivers();

        @GET("/api/warehouses.json")
        Call<List<Warehouse>> getWarehuses();
}

这是我的api帮助器类:

public class APIHelper {

    public static final String BASE_URL = "https://part-of-url.herokuapp.com/";

    public static APIService apiService;

    public static APIService getApiService() {
        if (apiService == null) {
            Retrofit retrofit = new Retrofit.Builder().baseUrl(BASE_URL)
                    .addConverterFactory(GsonConverterFactory.create()).build();
            apiService = retrofit.create(APIService.class);
        }
        return apiService;
    }
}

这是我的驱动程序pojo模型(所有pojo模型几乎相同)

public class Driver {

    @Expose
    private List<String> driver_name = new ArrayList<String>();

    public List<String> getDriver_name() { return driver_name; }

    public void setDriver_name(List<String> driver_name) { this.driver_name = driver_name; }
}

这是我的Fragment,我在其中获得了合作伙伴的回调,并且需要实现另一个按钮来获取驱动程序,而第三个按钮来获取一些存储空间。

public class DownloadMain extends Fragment implements Callback<Partner> {

    private static final String TAG = DownloadMain.class.getSimpleName();

    private Button dloadPartners, takeDrivers, takeWarehouses, takeUsers, takeLogs;
    private Call callPartners;

    public DownloadMain() {}

    public DownloadMain newInstance() { return new DownloadMain(); }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.download_main, container, false);

        dloadPartners = (Button) view.findViewById(R.id.downloadPartners);
        takeDrivers = (Button) view.findViewById(R.id.btnDrivers);
        dloadPartners.setOnClickListener(btnListener);
        takeDrivers.setOnClickListener(btnDrivers);

        callPartners = APIHelper.getApiService().getPartners();

        return view;
    }

    Button.OnClickListener btnListener = (new Button.OnClickListener() {
        @Override
        public void onClick(View v) {
            callPartners.clone().enqueue(DownloadMain.this);
            checkIfDataIsInTable();
        }
    });
 @Override
    public void onResponse(Call call, Response response) {

        if(response.body() == null) {
            try {
                response.errorBody().string();
            } catch (IOException e) {
                e.printStackTrace();
            }
            Toast.makeText(getActivity(), "No Partners!", Toast.LENGTH_SHORT).show();
        } else {
            ArrayList<String> partners = (ArrayList<String>) response.body();

            ActiveAndroid.beginTransaction();
            try {
                for (int i = 0; i < partners.size() ; i++) {
                    Partners partner = new  Partners();
                    partner.name = String.valueOf(partners);
                    partner.save();
                    Log.d("partner_ ", String.valueOf(response.body()));
                }
                ActiveAndroid.setTransactionSuccessful();
            } finally {
                ActiveAndroid.endTransaction();
            }

            Log.d(TAG, "Number of partners received: " + partners.size());
            Toast.makeText(getActivity(), "Partners downloaded!", Toast.LENGTH_SHORT).show();
        }

    }

    @Override
    public void onFailure(Call call, Throwable t) {

    }
}

现在,我很难实现第二个按钮来从api获取数据。

如果有人可以帮助我实现第二个按钮来从api获取驱动程序,我将不胜感激

道格·沃斯

使用retrofit2,您可以与call.enqueue内联进行onResponse和onFailure,这使您可以在同一活动中使用多种调用类型,因为它们被封装在call.enqueue()中

// the following can be in the same activity
Call<YourPOJO1> call1 = client.callName1(params);
call1.enqueue(new Callback<YourPOJO1>() {
        @Override
        public void onResponse(Call<YourPOJO1> call, Response<YourPOJO1> response) {
            Log.d(TAG, "Call1 Succeeded");
            int code = response.code();
            if (code == 200) {
       // your parsing of POJO1 here
            } else {
                Log.d(TAG, "Error Happened");
            }
        }

        @Override
        public void onFailure(Call<YourPOJO1> call, Throwable t) {
            Log.d(TAG, "Call1 Failed");
        }
    });


Call<YourPOJO2> call2 = client.callName2(params);
call2.enqueue(new Callback<YourPOJO2>() {
        @Override
        public void onResponse(Call<YourPOJO2> call, Response<YourPOJO2> response) {
            Log.d(TAG, "Call2 Succeeded");
            int code = response.code();
            if (code == 200) {
       // your parsing of POJO2 here
            } else {
                Log.d(TAG, "Error Happened");
            }
        }

        @Override
        public void onFailure(Call<YourPOJO2> call, Throwable t) {
            Log.d(TAG, "Call2 Failed");
        }
    });

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在返回堆栈防止同一片段

如何在Android中定义回调?

防止同一片段堆叠超过一次(addToBackStack)

将Depthbuffer和TextureBuffer发送到同一片段OpenGL3

从其他活动返回同一片段时,如何保存和恢复片段中RecyclerView的滚动位置?

EventBus在同一片段中发布和订阅

如何多次将同一片段包含到m3u8播放列表中?

Android导航:从同一片段访问NavHostFragment

在将某些数据传递到活动后,如何从同一片段中结束片段?

Android中的回调

片段到活动再次在同一片段上

如何在Android中为同一实体ID缓存多个图像

Android:如何在同一个文件中迭代多个JSON对象数组

使用NavigatorDrawer时如何从一个片段或活动更改为另一片段或活动?

如何在Android中重用片段的视图?

如何在Android中删除/杀死同一活动的多个副本?

如何在Java / Android中的回调函数中设置局部变量?

如何在Android中的多个片段之间传递数据

如何在Android中的同一活动上将TextView从一个片段更新为另一个片段

如何通过单击后退(不是“后退硬件”按钮)返回到上一片段?

如何在Android中刷新片段

如何在Android的TabLayout中替换片段

如何在 Android 中包含布局片段

如何在 Android 中重用 Retrofit 代码

如何使用片段中的相机并在同一片段的图像视图中显示捕获的图像?

如何使用 Retrofit 在 Adapter Class Android 中创建多个函数

Ubuntu 18.04 上的 Android Studio:未找到片段...如何“在代码中创建一个或多个片段”?

防止导航到同一片段

如何在android中从BottomSheetDialogFragment调用片段