Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/213.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/243.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_Dependency Injection_Dagger - Fatal编程技术网

Java 匕首注入-何时调用提供方法

Java 匕首注入-何时调用提供方法,java,android,dependency-injection,dagger,Java,Android,Dependency Injection,Dagger,我正在Android上试用Dagger,它似乎是一个隔离依赖关系的好工具。首先,我从GitHub复制了android活动图示例: 然后,我向ActivityModule添加了几个类 @模块( 注入={ HomeActivity.class, HomeFragment.class }, addsTo=AndroidModule.class, 库=真 ) 公共类活动模块{ 私有静态最终字符串TAG=“活动\模块”; 私人活动; 公共活动模块(DemoBaseActivity活动){ 这个。活动=活动

我正在Android上试用Dagger,它似乎是一个隔离依赖关系的好工具。首先,我从GitHub复制了android活动图示例:

然后,我向ActivityModule添加了几个类

@模块(
注入={
HomeActivity.class,
HomeFragment.class
},
addsTo=AndroidModule.class,
库=真
)
公共类活动模块{
私有静态最终字符串TAG=“活动\模块”;
私人活动;
公共活动模块(DemoBaseActivity活动){
这个。活动=活动;
}
/**
*允许注入活动上下文,但要求使用
*{@link ForActivity@ForActivity}以明确区分它与应用程序上下文。
*/
@提供
@独生子女
@有性行为
上下文提供活动上下文(){
返回活动;
}
@提供
@独生子女
ActivityTitleController提供标题控制器(){
返回新活动标题控制器(活动);
}
//我从这里添加的内容
@提供
@独生子女
玩家提供玩家(){
Log.i(标记“in providePlayer()”);
返回新的MyAndroidTestPlayer(活动);
}
@提供
RandomNumberGenerator provideRandomNumberGenerator(){
Log.i(标记“in provideRandomNumberGenerator()”);
返回新的RealRandomNumberGenerator();
}
}
图形初始化的其余部分与github中的示例相同

让我困惑的是,在构造注入对象的类(HomeFragment)之后,注入的对象是空的。。。有一段时间。 同样,HomeFragment与github中示例中的HomeFragment大致相同,只是添加了一些我自己的内容。 如果我在HomeFragment的onCreateView()中调用注入的Player或RandomNumberGenerator对象中的任意一个,我会得到一个错误,说它们为null。 但是,如果我在内部OnClickListener-onClick()中调用它们,它们将按预期工作

有人能告诉我我所缺少的知识来理解这里发生了什么吗

公共类HomeFragment扩展了DemoBaseFragment{
公共静态最终字符串TAG=“HOME\u FRAGMENT”;
公共静态HomeFragment newInstance(){
返回新的HomeFragment();
}
@注入
活动标题控制器标题控制器;
@注入
玩家;
@注入
随机数发生器随机数发生器;
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
TextView tv=新的TextView(getActivity());
if(randomNumberGenerator!=null){
Log.i(标记“randomNumberGenerator不为空”);
}否则{
Log.e(标记“randomNumberGenerator为空!”);
}
如果(玩家!=null){
Log.i(标记“播放器不为空”);
}否则{
Log.e(标记“玩家为空!”);
}
//int randomNumber=randomNumberGenerator.GetIntegerRange(48,50);
//playTestNote();
电视。设置重力(中心);
tv.setText(“播放测试笔记”);
电视.setTextSize(40);;
tv.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
playTestNote();
int randomNumber=randomNumberGenerator.GetIntegerRange(48,50);
Log.i(标签,点击文本视图,随机数为:“+randomNumber”);
}
});
返回电视;
}
我用来测试的类非常简单(RandomNumberGenerator比Player类更简单)。我将跳过RandomNumberGenerator。下面是实现Player的MyAndroidTestPlayer(只有一个playTestNote()方法)

公共类MyAndroidTestPlayer实现播放器{
声池声池;
私有静态最终整数最大流=10;
私有静态最终int默认值\u SRC\u质量=0;
私有静态最终整数硬编码\u声音\u资源\u C3=R.raw.midi\u 48\u C3;
私有静态最终int默认值_优先级=1;
私有静态最终字符串标记=“MyAndroidTestPlayer”;
私人语境;
私有布尔值isLoaded=false;
私有int-streamId;
私有内部声音ID;
公共MyAndroidTestPlayer(上下文){
this.context=上下文;
if(Build.VERSION.SDK\u INT>=Build.VERSION\u code.LOLLIPOP){
createNewSoundPool();
}否则{
createOldSoundPool();
}
}
受保护的void createOldSoundPool(){
soundPool=新的soundPool(最大流,AudioManager.STREAM音乐,默认SRC质量);
Log.i(标记“创建的旧声音池”);
loadSoundPool();
}
受保护的void createNewSoundPool(){
AudioAttributes=new AudioAttributes.Builder().setUsage(AudioAttributes.USAGE\u MEDIA).setContentType(AudioAttributes.CONTENT\u TYPE\u SONIFICATION).build();
soundPool=新建soundPool.Builder().setAudioAttributes(attributes.build();
Log.i(标记“创建新的声音池”);
loadSoundPool();
}
私有void loadSoundPool(){
soundPool.setOnLoadCompleteListener(新的soundPool.OnLoadCompleteListener(){
@凌驾
public void onLoadComplete(声音池声音池,int-sampleId,
int状态){
isLoaded=true;
Log.i(标签“已加载”);
Log.i(标签,“状态:”+状态);
}
});
soundId=soundPool.load(上下文、硬编码的声音资源、默认优先级);
}
@凌驾
public void playTestNote(){
日志i(标签“加载前检查”);
如果(已加载){
streamId=soundPool.play(soundId,1,1,0,1f);
Log.i(标记“播放的声音”);
Log.i(标签“streamId:+streamId”);
}
}
}


提前谢谢。

我想我明白了。HomeFragment必须@Override onCreate并使用以下行注入自身

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    ((DemoBaseActivity) getActivity()).inject(this);
}
那对我来说就行了

我希望这将有助于我的unde级别的其他用户