Android 如何使用Dagger2注入改型数据服务

Android 如何使用Dagger2注入改型数据服务,android,dependency-injection,retrofit,rx-java,dagger-2,Android,Dependency Injection,Retrofit,Rx Java,Dagger 2,在我的MVP架构中,我有一个改造实例 public class RetrofitInstance { private static Retrofit retrofit; private static final String BASE_URL = "http://api.openweathermap.org/data/2.5/"; /** * Create an instance of Retrofit object * */ public

在我的MVP架构中,我有一个改造实例

public class RetrofitInstance {
    private static Retrofit retrofit;
    private static final String BASE_URL = "http://api.openweathermap.org/data/2.5/";

    /**
     * Create an instance of Retrofit object
     * */
    public static Retrofit getRetrofitInstance() {
        if (retrofit == null) {
            retrofit = new retrofit2.Retrofit.Builder()
                    .baseUrl(BASE_URL)
                    .addConverterFactory(GsonConverterFactory.create())
                    .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                    .build();
        }
        return retrofit;
    }
}
以及它的数据服务

public interface GetNoticeDataService {
    @GET("weather?appid=0194877ecdcac230396a119c01d46100")
    Observable<NoticeList> getNoticeData(@Query("lat") double lat , @Query("lon") double lon );
}
这是演示者

public class MainPresenterImpl implements MainContract.presenter, MainContract.GetNoticeIntractor.OnFinishedListener {
 private MainContract.MainView mainView;
        private MainContract.GetNoticeIntractor getNoticeIntractor;
        @Inject
        public MainPresenterImpl(MainContract.MainView mainView, MainContract.GetNoticeIntractor getNoticeIntractor) {
            this.mainView = mainView;
            this.getNoticeIntractor = getNoticeIntractor;
        }

        @Override
        public void onDestroy() {

            mainView = null;

        }

        @Override
        public void onRefreshButtonClick() {

            if(mainView != null){
                mainView.showProgress();
            }
            getNoticeIntractor.getNoticeArrayList(this);
        }

        @Override
        public void requestDataFromServer() {
            getNoticeIntractor.getNoticeArrayList(this);
        }


        @Override
        public void onFinished(ArrayList<Notice> noticeArrayList, Main main, Wind wind) {
            if(mainView != null){
                mainView.setDataToRecyclerView(noticeArrayList,main,wind);
                mainView.hideProgress();
            }
        }



        @Override
        public void onFailure(Throwable t) {
            if(mainView != null){
                mainView.onResponseFailure(t);
                mainView.hideProgress();
            }
        }
    }
公共类MainPresenterImpl实现MainContract.presenter、MainContract.GetNoticeInactor.OnFinishedListener{
private main contract.MainView MainView;
private main contract.GetNoticeIntractor GetNoticeIntractor;
@注入
public MainPresenterImpl(MainContract.MainView MainView,MainContract.GetNoticeIntractor GetNoticeIntractor){
this.mainView=mainView;
this.getNoticeIntractor=getNoticeIntractor;
}
@凌驾
公共空间{
mainView=null;
}
@凌驾
公共无效onRefreshButtonClick(){
if(mainView!=null){
mainView.showProgress();
}
getNoticeIntractor.getNoticeArrayList(此);
}
@凌驾
public void requestDataFromServer(){
getNoticeIntractor.getNoticeArrayList(此);
}
@凌驾
已完成公共空隙(阵列列表公告列表、主干道、风){
if(mainView!=null){
mainView.setDataToRecyclerView(noticeArrayList,main,wind);
mainView.hideProgress();
}
}
@凌驾
失效时的公共无效(可丢弃的t){
if(mainView!=null){
mainView.onResponseFailure(t);
mainView.hideProgress();
}
}
}
主合同

public interface MainContract {
    /**
     * Call when user interact with the view and other when view OnDestroy()
     * */
    interface presenter{

        void onDestroy();

        void onRefreshButtonClick();

        void requestDataFromServer();

    }

    /**
     * showProgress() and hideProgress() would be used for displaying and hiding the progressBar
     * while the setDataToRecyclerView and onResponseFailure is fetched from the GetNoticeInteractorImpl class
     **/
    interface MainView {

        void showProgress();

        void hideProgress();

        void setDataToRecyclerView(ArrayList<Notice> noticeArrayList, Main main, Wind wind);

        void onResponseFailure(Throwable throwable);

    }

    /**
     * Intractors are classes built for fetching data from your database, web services, or any other data source.
     **/
    interface GetNoticeIntractor {

        interface OnFinishedListener {
            void onFinished(ArrayList<Notice> noticeArrayList, Main main, Wind wind);
            void onFailure(Throwable t);
        }
        void getNoticeArrayList(OnFinishedListener onFinishedListener);

    }
}
公共接口主合同{
/**
*当用户与视图交互时调用,当查看OnDestroy()时调用
* */
界面演示者{
void onDestroy();
void onRefreshButtonClick();
void requestDataFromServer();
}
/**
*showProgress()和hideProgress()将用于显示和隐藏progressBar
*而SetDataToRecycleView和onResponseFailure是从GetNoticeInteractorImpl类获取的
**/
界面主视图{
void showProgress();
void hideProgress();
void setDataToRecyclerView(阵列列表通知列表、干管、风);
响应无效(可丢弃可丢弃);
}
/**
*intractor是为从数据库、web服务或任何其他数据源获取数据而构建的类。
**/
接口GetNoticeIntractor{
接口OnFinishedListener{
无效完成(阵列列表通知列表、主干道、风);
失效无效(可丢弃的t);
}
void getNoticeArrayList(OnFinishedListener OnFinishedListener);
}
}
MyActivity的适配器

public class NoticeAdapter extends RecyclerView.Adapter<NoticeAdapter.EmployeeViewHolder> {

    private static Wind wind;
    private static ArrayList<Notice> dataList;
    private static Main main;
    private Date currentTime = Calendar.getInstance().getTime();
    public static String date;
    private Context mContext;

    private RecyclerItemClickListener recyclerItemClickListener;
    public NoticeAdapter(ArrayList<Notice> dataList, Main main, Wind wind, RecyclerItemClickListener recyclerItemClickListener,Context context) {
        NoticeAdapter.dataList = dataList;
        NoticeAdapter.main = main;
        NoticeAdapter.wind = wind;
        this.recyclerItemClickListener = recyclerItemClickListener;
        this.mContext=context;
    }

    @NonNull
    @Override
    public EmployeeViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
        View view = layoutInflater.inflate(R.layout.single_view_row, parent, false);
        return new EmployeeViewHolder(view);
    }

    @SuppressLint("SetTextI18n")
    @Override
    public void onBindViewHolder(@NonNull EmployeeViewHolder holder, @SuppressLint("RecyclerView") final int position) {
        setDate(currentTime.toString().substring(0,currentTime.toString().length()-18));
        if(getAddressMap()!=null){holder.txtNoticeAddress.setText("Loc: "+getAddressMap());}else{holder.txtNoticeAddress.setText("Loc: Unknown location");}
        holder.imageIcon.setImageURI(Uri.parse("android.resource://com.locweather/drawable/i"+dataList.get(position).getIcon()));
        holder.txtNoticeWind.setText("Wind: "+roundUp(+wind.getSpeed())+"m/s, "+arrow());
        holder.txtNoticeTempMain.setText(roundUp(+main.getTemp())+"°C");
        holder.txtNoticeWeather.setText(dataList.get(position).getWeather()+" : "+dataList.get(position).getInfo());
        holder.txtNoticeTemp.setText("Feels: "+roundUp(+main.getFeelsLike())+"°C ");
        holder.txtNoticeTime.setText(date);
        holder.txtNoticeHumidity.setText("Humidity: "+main.getHumidity()+"%");
        holder.txtNoticePressure.setText("Pressure: "+main.getPressure()+"hPa");
        holder.itemView.setOnClickListener(v -> {
            recyclerItemClickListener.onItemClick();
            saveNoticeList(mContext,dataList); });
        holder.saveButton.setOnClickListener(v -> {
            recyclerItemClickListener.onItemClick();
            saveNoticeList(mContext,dataList); });
    }

    private static String getAddressMap() {
        return MapsActivity.addressMap;
    }

    private static void setDate(String date) {
        NoticeAdapter.date = date;
    }

    @Override
    public int getItemCount() {
        return dataList.size();
    }
    private static LatLng getloc(){
        return currentLocation;
    }

    class EmployeeViewHolder extends RecyclerView.ViewHolder {
        ImageView imageIcon;
        Button saveButton;
        TextView txtNoticeWeather, txtNoticeTempMain,txtNoticeTemp, txtNoticeHumidity,txtNoticeAddress,txtNoticePressure,txtNoticeWind,txtNoticeTime;

        EmployeeViewHolder(View itemView) {
            super(itemView);
            saveButton=itemView.findViewById(R.id.save_button);
            imageIcon=itemView.findViewById(R.id.image_icon);
            txtNoticeTime= itemView.findViewById(R.id.txt_time);
            txtNoticeWind= itemView.findViewById(R.id.txt_notice_wind);
            txtNoticeAddress=  itemView.findViewById(R.id.txt_notice_title);
            txtNoticeWeather =  itemView.findViewById(R.id.txt_notice_weather);
            txtNoticeTemp =  itemView.findViewById(R.id.txt_notice_temp);
            txtNoticeHumidity =  itemView.findViewById(R.id.txt_notice_humidity);
            txtNoticePressure =  itemView.findViewById(R.id.txt_notice_pressure);
            txtNoticeTempMain =  itemView.findViewById(R.id.txt_notice_temp_main);
        }
    }
    private static void saveNoticeList(Context context, List<Notice> noticeList) {
        if (context != null && noticeList != null) {
            WeatherData weatherData = new WeatherData(getAddressMap(), wind.getSpeed(), wind.getDeg(), dataList.get(0).getIcon(), dataList.get(0).getInfo(), dataList.get(0).getWeather(), main.getTemp(), main.getFeelsLike(), main.getHumidity(), main.getPressure(), date, getloc().latitude, getloc().longitude);
            WeatherDatabase.getInstance(context)
                    .weatherDao()
                    .save(weatherData);
        }
    }
公共类NoticeAdapter扩展了RecyclerView.Adapter{ 私人静风; 私有静态ArrayList数据列表; 私有静态主; private Date currentTime=Calendar.getInstance().getTime(); 公共静态字符串日期; 私有上下文; 私人回收商ClickListener回收商ClickListener; 公共通知适配器(ArrayList数据列表、Main、Wind Wind、RecyclerItemClickListener RecyclerItemClickListener、上下文上下文){ noticedapter.dataList=数据列表; NoticeAdapter.main=main; noticedapter.wind=风; this.recyclerItemClickListener=recyclerItemClickListener; this.mContext=上下文; } @非空 @凌驾 public EmployeeViewHolder onCreateViewHolder(@NonNull ViewGroup父级,int-viewType){ LayoutInflater LayoutInflater=LayoutInflater.from(parent.getContext()); 视图=布局更平坦。充气(R.layout.single\u View\u row,parent,false); 返回新的EmployeeViewHolder(视图); } @SuppressLint(“SetTextI18n”) @凌驾 BindViewHolder上的公共无效(@NonNull EmployeeViewHolder,@SuppressLint(“RecyclerView”)最终整数位置){ setDate(currentTime.toString().substring(0,currentTime.toString().length()-18)); if(getAddressMap()!=null){holder.txtNoticeAddress.setText(“Loc:+getAddressMap());}else{holder.txtNoticeAddress.setText(“Loc:未知位置”);} holder.imageIcon.setImageURI(Uri.parse。resource://com.locweather/drawable/i“+dataList.get(position.getIcon()); holder.txnoticewind.setText(“风:+roundUp(+Wind.getSpeed())+“m/s,+arrow()); holder.txnoticetempmain.setText(roundUp(+main.getTemp())+“°C”); holder.txnoticewather.setText(dataList.get(position.getWeather()+):“+dataList.get(position.getInfo()); holder.txnoticetemp.setText(“感觉:+roundUp(+main.getfeellike())+”°C”); holder.txnoticetime.setText(日期); holder.txnoticehumidity.setText(“湿度:”+main.get湿度()+“%”); holder.txnoticepressure.setText(“压力:“+main.getPressure()+“hPa”); holder.itemView.setOnClickListener(v->{ recyclerItemClickListener.onItemClick(); saveNoticeList(mContext,dataList);}); holder.saveButton.setOnClickListener(v->{ recyclerItemClickListener.onItemClick(); saveNoticeList(mContext,dataList);}); } 私有静态字符串getAddressMap(){ 返回MapsActivity.addressMap; } 私有静态void setDate(字符串日期){ noticedapter.date=日期; } @凌驾 public int getItemCount(){ 返回dataList.size(); } 专用静态LatLng getloc(){ 返回当前位置; } 类EmployeeViewHolder扩展了RecyclerView.ViewHolder{ 图像视图图像图标; 按钮保存按钮; TextView txtNoticeWither、txtNoticeTempMain、txtNoticeTemp、txtNoticeHumanity、txtNoticeAddress、txtNoticePressure、txtNoticeWind、txtNoticeTime; EmployeeViewHolder(查看项目视图){ 超级(项目视图); saveButton=itemView.findViewById(R.id.save_按钮);
public class NoticeAdapter extends RecyclerView.Adapter<NoticeAdapter.EmployeeViewHolder> {

    private static Wind wind;
    private static ArrayList<Notice> dataList;
    private static Main main;
    private Date currentTime = Calendar.getInstance().getTime();
    public static String date;
    private Context mContext;

    private RecyclerItemClickListener recyclerItemClickListener;
    public NoticeAdapter(ArrayList<Notice> dataList, Main main, Wind wind, RecyclerItemClickListener recyclerItemClickListener,Context context) {
        NoticeAdapter.dataList = dataList;
        NoticeAdapter.main = main;
        NoticeAdapter.wind = wind;
        this.recyclerItemClickListener = recyclerItemClickListener;
        this.mContext=context;
    }

    @NonNull
    @Override
    public EmployeeViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
        View view = layoutInflater.inflate(R.layout.single_view_row, parent, false);
        return new EmployeeViewHolder(view);
    }

    @SuppressLint("SetTextI18n")
    @Override
    public void onBindViewHolder(@NonNull EmployeeViewHolder holder, @SuppressLint("RecyclerView") final int position) {
        setDate(currentTime.toString().substring(0,currentTime.toString().length()-18));
        if(getAddressMap()!=null){holder.txtNoticeAddress.setText("Loc: "+getAddressMap());}else{holder.txtNoticeAddress.setText("Loc: Unknown location");}
        holder.imageIcon.setImageURI(Uri.parse("android.resource://com.locweather/drawable/i"+dataList.get(position).getIcon()));
        holder.txtNoticeWind.setText("Wind: "+roundUp(+wind.getSpeed())+"m/s, "+arrow());
        holder.txtNoticeTempMain.setText(roundUp(+main.getTemp())+"°C");
        holder.txtNoticeWeather.setText(dataList.get(position).getWeather()+" : "+dataList.get(position).getInfo());
        holder.txtNoticeTemp.setText("Feels: "+roundUp(+main.getFeelsLike())+"°C ");
        holder.txtNoticeTime.setText(date);
        holder.txtNoticeHumidity.setText("Humidity: "+main.getHumidity()+"%");
        holder.txtNoticePressure.setText("Pressure: "+main.getPressure()+"hPa");
        holder.itemView.setOnClickListener(v -> {
            recyclerItemClickListener.onItemClick();
            saveNoticeList(mContext,dataList); });
        holder.saveButton.setOnClickListener(v -> {
            recyclerItemClickListener.onItemClick();
            saveNoticeList(mContext,dataList); });
    }

    private static String getAddressMap() {
        return MapsActivity.addressMap;
    }

    private static void setDate(String date) {
        NoticeAdapter.date = date;
    }

    @Override
    public int getItemCount() {
        return dataList.size();
    }
    private static LatLng getloc(){
        return currentLocation;
    }

    class EmployeeViewHolder extends RecyclerView.ViewHolder {
        ImageView imageIcon;
        Button saveButton;
        TextView txtNoticeWeather, txtNoticeTempMain,txtNoticeTemp, txtNoticeHumidity,txtNoticeAddress,txtNoticePressure,txtNoticeWind,txtNoticeTime;

        EmployeeViewHolder(View itemView) {
            super(itemView);
            saveButton=itemView.findViewById(R.id.save_button);
            imageIcon=itemView.findViewById(R.id.image_icon);
            txtNoticeTime= itemView.findViewById(R.id.txt_time);
            txtNoticeWind= itemView.findViewById(R.id.txt_notice_wind);
            txtNoticeAddress=  itemView.findViewById(R.id.txt_notice_title);
            txtNoticeWeather =  itemView.findViewById(R.id.txt_notice_weather);
            txtNoticeTemp =  itemView.findViewById(R.id.txt_notice_temp);
            txtNoticeHumidity =  itemView.findViewById(R.id.txt_notice_humidity);
            txtNoticePressure =  itemView.findViewById(R.id.txt_notice_pressure);
            txtNoticeTempMain =  itemView.findViewById(R.id.txt_notice_temp_main);
        }
    }
    private static void saveNoticeList(Context context, List<Notice> noticeList) {
        if (context != null && noticeList != null) {
            WeatherData weatherData = new WeatherData(getAddressMap(), wind.getSpeed(), wind.getDeg(), dataList.get(0).getIcon(), dataList.get(0).getInfo(), dataList.get(0).getWeather(), main.getTemp(), main.getFeelsLike(), main.getHumidity(), main.getPressure(), date, getloc().latitude, getloc().longitude);
            WeatherDatabase.getInstance(context)
                    .weatherDao()
                    .save(weatherData);
        }
    }
@Module
object WebServiceModule {

    @Singleton
    @Provides
    fun providesGetNoticeDataService(retrofit: Retrofit): GetNoticeDataService =
        retrofit.create<GetNoticeDataService>(GetNoticeDataService::class.java)

    @Provides
    fun providesGsonConverterFactory(): GsonConverterFactory = GsonConverterFactory.create()

    @Provides
    fun providesOkHttpClient(loggingInterceptor: HttpLoggingInterceptor): OkHttpClient =
        OkHttpClient.Builder()
            .connectTimeout(20, TimeUnit.SECONDS)
            .readTimeout(20, TimeUnit.SECONDS)
            .addInterceptor(loggingInterceptor)
            .build()

    @Provides
    fun providesOkHttpLoggingInterceptor(): HttpLoggingInterceptor =
        HttpLoggingInterceptor().apply {
            level = HttpLoggingInterceptor.Level.BODY
        }

    @Provides
    fun provideRxJava2CallAdapterFactory(): RxJava2CallAdapterFactory =
        RxJava2CallAdapterFactory.create()

    @Provides
    fun providesRetrofit(
        client: OkHttpClient,
        converterFactory: GsonConverterFactory,
        adapterFactory: RxJava2CallAdapterFactory
    ): Retrofit = Retrofit.Builder()        
        .baseUrl(BASE_URL) 
        .addConverterFactory(converterFactory)
        .addCallAdapterFactory(adapterFactory)
        .client(client)
        .build()
}
@Module
public class WebServiceModule {
    @Singleton
    @Provides
    Retrofit provideRetrofit() {
        // This method tells Dagger all it needs to know about creating
        // a Retrofit instance. This will be replaced by something closer
        // to BWappsandmore's answer after RetrofitInstance is no longer needed.
        return RetrofitInstance.getRetrofitInstance();
    }

    @Singleton
    @Provides
    GetNoticeDataService provideGetNoticeDataService(Retrofit retrofit) {
        return retrofit.create(GetNoticeDataService.class);
    }
// @Reusable or @Singleton if you only need one interactor of this type.
public class GetNoticeInteractorImpl implements MainContract.GetNoticeInteractor {
    private GetNoticeDataService service

    @Inject
    GetNoticeInteractorImpl(GetNoticeDataService service) {
        this.service = service;
    }

    private LatLng getloc(){
        return currentLocation;
    }
    @SuppressLint("CheckResult")
    @Override
    public void getNoticeArrayList(final OnFinishedListener onFinishedListener) {

        // Our service was injected in the constructor, so there
        // is no need to create it here.

        // You might also consider injecting your schedulers in the future
        // for unit testing.
        if(currentLocation!=null) {
            service.getNoticeData(getloc().latitude, getloc().longitude)
                    .subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread())
                            .subscribe(items -> onFinishedListener.onFinished(items.getNoticeArrayList(), items.getMain(), items.getWind()), onFinishedListener::onFailure);

        }
    }

}

@Module
abstract class AnotherModule { // or interface
    @Binds
    abstract MainContract.GetNoticeInteractor bindGetNoticeInteractor(GetNoticeInteractorImpl implementation);
}
@Component(modules = {WebServicesModule.class, AnotherModule.class})
@Singleton
public interface AppComponent {
    @Component.Factory
    interface Factory {
        AppComponent create(@BindsInstance Application application); // or whatever
    }

    void bindMainActivity(MainActivity activity);
}

// Probably not a singleton, but if you create an activity scope later, this might use that scope.
class MainPresenter {
    @Inject
    public MainPresenter(MainContract.GetNoticeInteractor interactor) {
        this.getNoticeInteractor = interactor
    }
    // ...
}

class MainActivity {
    @Inject
    MainPresenter presenter;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        somehowGetComponent().inject(this);
        super(savedInstanceState);
        // ...
    }
    // ...
}