我试图在片段多个按钮中实现,每个按钮需要从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; } }
这是我的片段,我得到了合作伙伴的回调,需要实现另一个按钮来获取驱动程序和第三个按钮来获取一些存储空间.
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,"Call2 Failed"); } });