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

时间:2016-09-07 20:36:40

标签: android android-fragments retrofit2

我正在尝试在片段多个按钮中实现,每个按钮都需要从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获取驱动程序,我将不胜感激?

2 个答案:

答案 0 :(得分:4)

使用retrofit2,您可以使用call.enqueue内联onResponse和onFailure,它允许您在同一个活动中拥有多个呼叫类型,因为它们被封装在call.enqueue()

  const styles = StyleSheet.create({
    instructions: {
      fontSize: 16,
      textAlign: 'center',
      margin: 15,
    },
  });

  render() {
    return (
      <View style={styles.container}>
        <Text style={styles.instructions}>
        <ChildComponent
          cascadingStyle={styles}
        />
      </View>
    );
  }

答案 1 :(得分:2)

您可以使用Base模型执行此操作,例如:

@GET("mypath") 
Call<MyBaseModel<List<MyModel>>> getData();

在片段中实现回调

Callback<MyBaseModel<List<?>>>

MyBaseModel的一个例子是:

public class MyBaseModel<Data> {
  private String page;
  private Data[] results;

  public String getPage() {
     return page;
  }

  public Data[] getResults() {
     return results;
  }
}

onResponse应返回:

 Callback<MyBaseModel<?>>

然后使用'instanceOf'

检查结果是否是模型的实例