Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/183.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用匕首注入活动_Java_Android_Dagger 2 - Fatal编程技术网

Java 使用匕首注入活动

Java 使用匕首注入活动,java,android,dagger-2,Java,Android,Dagger 2,我尝试使用mvp和RXAndroid使用dagger 2创建示例应用程序,每件事都正常工作,但我无法注入活动。以下是我的AppComponent @Singleton @Component(modules = {AppModule.class}) public interface AppComponent { void inject(App app); void inject(MainActivity activity); void inject(ResponseSe

我尝试使用mvp和RXAndroid使用dagger 2创建示例应用程序,每件事都正常工作,但我无法注入活动。以下是我的AppComponent

@Singleton
@Component(modules = {AppModule.class})
public interface AppComponent {
    void inject(App app);

    void inject(MainActivity activity);

    void inject(ResponseService service);

    void inject(MainPresenter presenter);
}
下面是我的模块

@Module
public class AppModule {

    private App app;
    public AppModule(App app) {
        this.app = app;
    }
    private static final String API_ENDPOINT = "url here";

    @Provides
    @Singleton
    public ApiService apiService() {
        OkHttpClient client = new OkHttpClient();


        Gson gson = new GsonBuilder().registerTypeAdapterFactory(new ClassTypeAdapterFactory())
                .registerTypeAdapter(Class.class, new ClassTypeAdapter()).create();


        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(API_ENDPOINT)
                .addConverterFactory(GsonConverterFactory.create(gson))
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .client(client)
                .build();

        return retrofit.create(ApiService.class);
    }

    @Provides
    @Singleton
    ResponseService responseService() {
        return new ResponseService(app.getComponent());
    }

    @Provides
    @Singleton
    MainPresenter mainPresenter() {
        return new MainPresenter(app.getComponent());
    }

    @Provides
    @Singleton
    EventBus eventBus() {
        return EventBus.getDefault();
    }
}
我正确地注入了所有东西,并且在尝试使用它时可以使用它们,除了
ManiActivity
给我空指针以下是我注入它的方式

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    ((App) getApplicationContext())
            .getComponent()
            .inject(this);

    setContentView(R.layout.activity_main);
    ButterKnife.bind(this);

    initRecyclerView();
    presenter.setView(this);
}
但当尝试在适配器中将其用作上下文并将其传递给毕加索库时,会出现以下异常
java.lang.IllegalArgumentException:Context不能为null。
以下是我如何使用它

@Inject
MainActivity activity;
并在onBindViewHolder中使用它,如下所示

Picasso.with(activity).load(response).fit().into(holder.ivCover);
我的适配器代码

public class ReAdapter extends RecyclerView.Adapter<ReAdapter.RViewHolder> {
    private List<Response> responseList;

    @Inject
    MainActivity appContext;


    public ReAdapter() {
    }

    public void setResponseList(List<Response> responseList) {
        this.responseList = responseList;
        notifyDataSetChanged();
    }

    @Override
    public RViewHolder onCreateViewHolder(final ViewGroup parent, final int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.response_item, parent, false);
        return new RViewHolder(view);
    }

    @Override
    public void onBindViewHolder(RViewHolder holder, int position) {
        final Response response = responseList.get(position);
            Picasso.with(appContext).load(response.getValue().toLowerCase()).fit().into(holder.ivd);
    }

    @Override
    public int getItemCount() {
        return responseList != null ? responseList.size() : 0;
    }


    public class RViewHolder extends RecyclerView.ViewHolder {
        @BindView(R.id.ivd)
        ImageView ivd;

        public RViewHolder(View view) {
            super(view);
            ButterKnife.bind(this, itemView);
        }
    }
}
公共类ReAdapter扩展了RecyclerView.Adapter{ 私人名单负责人; @注入 主活动和上下文; 公共读取器(){ } 公共无效集合响应列表(列表响应列表){ this.responseList=响应列表; notifyDataSetChanged(); } @凌驾 public RViewHolder onCreateViewHolder(最终视图组父级,最终int视图类型){ View=LayoutFlater.from(parent.getContext()).flate(R.layout.response_项,parent,false); 返回新的RVIEWolder(视图); } @凌驾 BindViewHolder上的公共无效(RViewHolder holder,内部位置){ 最终响应=响应列表get(位置); 将(response.getValue().toLowerCase()).fit()加载到(holder.ivd)中; } @凌驾 public int getItemCount(){ return responseList!=null?responseList.size():0; } 公共类RViewHolder扩展了RecyclerView.ViewHolder{ @BindView(R.id.ivd) 图像视图ivd; 公共RVIEWolder(视图){ 超级(视图); ButterKnife.bind(这个,itemView); } } } 有人能帮我解决这个问题吗?

  • 您的活动:
    MainActivity
    没有带
    @Inject
    注释的构造函数(并且不能有,因为它是由系统创建的)
  • AppModule
    中,没有
    @提供返回
    MainActivity
    的带注释的方法
  • 您是在活动中而不是在适配器中注入字段
结果是,
Dagger
不知道如何创建类型为
MainActivity
的对象

此特定问题的解决方案是使用
毕加索
的应用程序上下文,或者更好地使用
匕首
创建一个
毕加索
对象

使用以下内容更新您的
AppModule

@Provides
@Singleton
Picasso providePicasso(App app) {
    return Picasso.with(app);
}
main活动中
添加一个字段:

@Inject
ReAdapter adapter;
ReAdapter
中修改构造函数并为毕加索添加字段:

private final Picasso picasso;

@Inject
public ReAdapter(Picasso picasso) {
    this.picasso = picasso;
}

通过这种方式,
Dagger
可以创建一个singleton
Picasso
实例。
ReAdapter
带有@Inject注释(使用构造函数注入),因此
Dagger
知道如何创建它。调用
组件时,通过在
MainActivity
中添加
ReAdapter
字段,在
MainActivity
中注入(此)
,适配器字段将被初始化

您正在适配器中调用AppComponent.inject吗?请包括有问题的代码,描述您在何处注入/创建对象以及如何注入/创建对象,不要只显示一行代码。我猜您刚刚在代码中添加了一些
@Inject
,不知道为什么什么都没发生?e、 g.仅在我的活动中查看@RafalMalek即使可以,您也不会希望注入活动。最多您需要注入一个上下文。您更喜欢使用应用程序上下文,而不是活动上下文。@DavidMedenjak检查更新的问题,并通过@Inject?@Ahmed更新了我的问题,解释了发生了什么。