我试图在IntelliJ中运行Dagger简单示例,但它在DemoBaseActivity类中的getApplication调用失败:
public abstract class DemoBaseActivity extends Activity {
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
((DemoApplication) getApplication()).inject(this);
}
}
Run Code Online (Sandbox Code Playgroud)
当它达到注入方法时,应用程序会无声地失败而没有错误.我使用基类Activity的实例而不是DemoBaseActivity构建了项目,并且它部署得很好.
有什么想法吗?
编辑:
当Activity的getApplication()调用的返回值被转换为自定义DemoApplication类型时,它似乎正在破坏.
package com.badlogic.androidgames.simple;
import android.app.Application;
import dagger.ObjectGraph;
import java.util.Arrays;
import java.util.List;
public class DemoApplication extends Application
{
private ObjectGraph graph;
@Override
public void onCreate()
{
super.onCreate();
graph = ObjectGraph.create(getModules().toArray());
}
protected List<Object> getModules()
{
return Arrays.asList(new AndroidModule(this), new DemoModule());
}
public void inject(Object object)
{
graph.inject(object);
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:这是堆栈跟踪:
10-03 05:15:25.331:ERROR/AndroidRuntime(5035):FATAL EXCEPTION:main java.lang.RuntimeException:无法启动活动ComponentInfo {com.badlogic.androidgames.simple/com.badlogic.androidgames.simple.ui. HomeActivity}:java.lang.ClassCastException:android.app.Application无法在android.app.ActivityThread.handleLaunchActivity的android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2211)上强制转换为com.badlogic.androidgames.simple.DemoApplication. (ActivityThread.java:2261)在Android.app.Handler.dispatchMessage(Handler)上的android.app.ActivityThread.access $ 600(ActivityThread.java:141)android.app.ActivityThread …
我下载了匕首,因为它似乎是Android中依赖注入的一个很好的选择.但是我在整合编译器时遇到了一些麻烦.是否有关于正确设置的提示?我按照关于android注释的说明进行操作,因为这个项目看起来很相似.但它对匕首不起作用.
我做了什么:我将dagger-1.1.0.jar和javax.inject-1.jar添加到我项目的lib文件夹中,并添加了一个名为"compile-libs"的新文件夹,其中包含"dagger-compiler-1.1.0.jar" "因为我不希望将此文件打包在*.apk中.

我将dagger和javax.inject添加到模块的依赖项中.
现在棘手的部分:我将编译器添加到注释编译器设置:

当我运行该程序时,我收到以下错误:无法加载类de.myproject.app.modules.AndroidModule的模块适配器.请确保为此模块运行代码生成.
所以在我看来代码生成并没有发生.另外,我项目中的"生成"文件夹是空的.那么在IntelliJ中让dagger在Android项目中工作的正确设置是什么?
我可以使用Dagger将不同的值注入到对象图深处的同一个类的多个实例中吗?我想避免通过图中的包含对象传递值(因此我可以更改包含对象的实现而不影响其容器).
这是一个人为的例子.对象图是一个Top,它包含一个Left和Right,每个都包含一个Show.所以Show有两个实例.
class Top {
Left left;
Right right;
void encodeTwice(String data) {
left.encode(data);
right.encode(data.getBytes());
}
}
class Left {
Leaf leaf;
void encode(String data) {
leaf.write(URLEncoder.encode(data));
}
}
class Right {
Leaf leaf;
void encode(byte[] data) {
leaf.write(DatatypeConverter.printBase64Binary(data));
}
}
interface Leaf {
void write(String data);
}
class Show implements Leaf {
String label;
@Override public void write(String data) {
System.out.println(label + ": " + data);
}
}
// There might be other classes that implement Leaf. …Run Code Online (Sandbox Code Playgroud) 所以我正在尝试谷歌汽车工厂,但我得到一个奇怪的错误.
工厂类:
@AutoFactory(
className = "MembersAdapterFactoryImpl"
)
public class MembersAdapter extends ArrayAdapter<Member> {
/**
* Get an instance of the helper
*/
private MembersAdapterHelper mMembersAdapterHelper;
public MembersAdapter(@Provided MembersAdapterHelper membersAdapterHelper,
Context context,
int resource,
List<Member> members){
super(context, resource, members);
mMembersAdapterHelper = membersAdapterHelper;
}
}
Run Code Online (Sandbox Code Playgroud)
生成的类:
package me.magneto.groups.adapters;
import javax.annotation.Generated;
import javax.inject.Inject;
import javax.inject.Provider;
@Generated("com.google.auto.factory.processor.AutoFactoryProcessor")
public final class MembersAdapterFactoryImpl {
private final Provider<MembersAdapterHelper> membersAdapterHelperProvider;
@Inject
public MembersAdapterFactoryImpl(Provider<MembersAdapterHelper> membersAdapterHelperProvider) {
this.membersAdapterHelperProvider = membersAdapterHelperProvider;
}
public MembersAdapter create(android.content.Context context, int resource, java.util.List<me.magneto.groups.models.group.Member> members) { …Run Code Online (Sandbox Code Playgroud) 我使用https://guides.codepath.com/android/Dependency-Injection-with-Dagger-2的 dagger2演示.我想使用缓存和非缓存的改进调用.我在NetModule.java中创建
@Provides @Named("cached")
@Singleton
OkHttpClient provideOkHttpClient(Cache cache) {
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.cache(cache)
.build();
return okHttpClient;
}
@Provides @Named("non_cached")
@Singleton
OkHttpClient provideOkHttpClientNonCached() {
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.build();
return okHttpClient;
}
Run Code Online (Sandbox Code Playgroud)
GitHubModule.java依赖于NetModule.java.我的GitHubComponent.java
@UserScope
@Component(dependencies = NetComponent.class, modules = GitHubModule.class)
public interface GitHubComponent {
void inject(DemoDaggerActivity activity);
}
Run Code Online (Sandbox Code Playgroud)
我的NetComponent.java
@Singleton
@Component(modules={ApplicationModule.class, NetModule.class})
public interface NetComponent {
// downstream components need these exposed
Retrofit retrofit();
OkHttpClient okHttpClient();
SharedPreferences sharedPreferences();
}
Run Code Online (Sandbox Code Playgroud)
在我的DemoDaggerActivity.java注入改造中:
@Inject @Named("cached")
OkHttpClient mOkHttpClient;
@Inject …Run Code Online (Sandbox Code Playgroud) 我是Dagger 2的新手,我已经尝试设置相同的工具。这是我的ActivityModule:
@Module
public abstract class ActivityModule {
@ContributesAndroidInjector
abstract ProductListActivity contributeProductListActivity();
@ContributesAndroidInjector
abstract ProductDetailsActivity contributeProductDetailsActivity();
}
Run Code Online (Sandbox Code Playgroud)
我的AppModule:
@Module
class AppModule {
@Provides
@Singleton
RedMartProductService provideRedMartProductService() {
........
}
........
.......
}
Run Code Online (Sandbox Code Playgroud)
我的AppComponent:
@Singleton
@Component(modules = {AndroidInjectionModule.class, ActivityModule.class, AppModule.class})
public interface AppComponent {
@Component.Builder
interface Builder {
@BindsInstance
Builder application(Application application);
AppComponent build();
}
void inject(MartApplication martApp);
}
Run Code Online (Sandbox Code Playgroud)
我的申请:
public class MartApplication extends Application implements HasActivityInjector {
@Inject
DispatchingAndroidInjector<Activity> dispatchingAndroidInjector;
@Override
public …Run Code Online (Sandbox Code Playgroud) 我正在尝试学习匕首2,但我对使用接口注入构造函数感到困惑.这是我的下面的代码:
MainActivity.java
public class MainActivity extends AppCompatActivity implements MainView {
// this keyword of request dependency . At compiling process, dagger will look at all of these annotations
//to create the exact dependency
@Inject MainPresenter mainPresenter ;
TextView textView ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = findViewById(R.id.textview) ;
DaggerPresenterComponent.create().inject(this);
textView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
mainPresenter.doThings(8555) ;
}
});
}
/**********************************/
@Override
public void invokeRandomViewMethod(String msg) {
textView.setText(msg);
}
}
Run Code Online (Sandbox Code Playgroud)
MainPresenter.java
public class …Run Code Online (Sandbox Code Playgroud) 我有自定义范围:
@Scope
@Retention(RetentionPolicy.RUNTIME)
public @interface PerActivity { }
Run Code Online (Sandbox Code Playgroud)
和使用此批注的组件:
@PerActivity
@Component(modules = {ActivityModule.class}, dependencies = AppComponent.class)
public interface ActivityComponent {
void inject(MainActivity mainActivity);
}
Run Code Online (Sandbox Code Playgroud)
和提供MainPresenter依赖关系的模块:
@Module
public class ActivityModule {
@PerActivity
@Provides
public MainPresenter provideMainPresenter(){
return new MainPresenter();
}
}
Run Code Online (Sandbox Code Playgroud)
这是MainPresenter注入的MainActivity:
public class MainActivity extends AppCompatActivity implements MainView {
@PerActivity
@Inject
MainPresenter mainPresenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
DaggerActivityComponent.builder()
.appComponent(DaggerAppComponent.builder().build())
.build()
.inject(this);
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题:在配置更改(方向更改)后重新创建演示者.
我的问题:如何让它只为一个活动创建一次?
我是匕首的新手,我已经定义了这样的应用程序组件
@Singleton
@Component(modules = {ApplicationModule.class})
public interface ApplicationComponent {
void inject(BaseActivity activity);
Context context();
}
Run Code Online (Sandbox Code Playgroud)
这是我的ApplicationModule
@Module
public class ApplicationModule {
public TipoApplication application;
public ApplicationModule(TipoApplication application) {
this.application = application;
}
@Singleton
@Provides
public Context provideContext(){return application.getApplicationContext();}
@Singleton
@Provides
public SharedPreferences provideSharedPreferences(Context context){
return PreferenceManager.getDefaultSharedPreferences(context);
}
@Singleton
@Provides
public Gson provideGson(){
return new Gson();
}
@Singleton
@Provides
public SharedPrefsManager provideSharedPrefsManager(SharedPreferences sharedPreferences, Gson gson){
return new SharedPrefsManager(sharedPreferences, gson);
}
}
Run Code Online (Sandbox Code Playgroud)
我创建了一个依赖的组件LocationProviderComponent
@LocationScope
@Component(dependencies = {ApplicationComponent.class},modules = {LocationProviderModule.class})
public interface LocationProviderComponent …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用Conductor(或任何自定义类)进行dagger-android工作.我尝试复制AndroidSupportInjectionModule(和朋友)所做的一切,在我看来,这是一种自定义类处理.
但是我得到了
C:\Users\ursus\AndroidStudioProjects\...\ControllersModule.java:15: error: com.foo.bar.ChannelsController is not a framework type
public abstract com.foo.bar.ChannelsController channelsController();
Run Code Online (Sandbox Code Playgroud)
所以,我的"库"代码
package com.foo.bar
import com.bluelinelabs.conductor.Controller;
import dagger.Module;
import dagger.android.AndroidInjectionModule;
import dagger.android.AndroidInjector;
import dagger.internal.Beta;
import dagger.multibindings.Multibinds;
import java.util.Map;
@Beta
@Module(includes = AndroidInjectionModule.class)
public abstract class ConductorInjectionModule {
private ConductorInjectionModule() {
}
@Multibinds
abstract Map<Class<? extends Controller>, AndroidInjector.Factory<? extends Controller>> controllerInjectorFactories();
@Multibinds
abstract Map<String, AndroidInjector.Factory<? extends Controller>> controllerInjectorFactoriesWithStringKeys();
}
Run Code Online (Sandbox Code Playgroud)
我甚至没有编译,所以假设粘贴ConductorInjection和HasControllerInjector毫无意义
用法:
@Module
abstract class AppModule {
@ContributesAndroidInjector abstract fun mainActivity(): MainActivity
@ContributesAndroidInjector abstract fun channelsController(): ChannelsController
}
class …Run Code Online (Sandbox Code Playgroud)