我正在为我的活动创建一个扩展应用程序图的子图。我想在活动上实现单例的使用,以管理活动中片段使用的WebTask。
问题: 我无法在HomeFragment中获得WebTask的单例实例(使用我的ConnectionModule注入HomeActivity)。
到目前为止,我有WebTask AsyncTask正在从Flickr API中检索xml,如下所示:
- 注入GetWebTask
- 执行AsyncTask
public class HomeActivity extends BaseActivity {
@Inject
GetWebTask httpTask;
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
//after the super.onCreate call returns, we are guaranteed our injections are available
//do something with injected dependencies here
if(savedInstanceState == null){
getSupportFragmentManager().beginTransaction()
.add(android.R.id.content, HomeFragment.newInstance())
.commit();
}
//working
httpTask.execute();
}
}
这将在GetWebTask中执行doInBackground方法,该方法从EndPoint中的getXMLContent方法返回XML内容的ArrayList。我调试了这个,成员变量mImages(ArrayList)确实包含数据。
尝试并导致错误
尝试在HomeFragment中使用相同的WebTask实例会给我一个NullPointerException错误。我假设自从我将WebTask注入Activity并执行如上所示的方法,我将拥有WebTask的相同实例(httpTask),包含它的mImages成员变量。我收到以下行的错误:
public class HomeFragment extends BaseFragment{
GridView mGridView;
ArrayList<Image> mImages;
GetWebTask httpTask;
// @Inject
// ActivityTitleController titleController;
public static HomeFragment newInstance(){
return new HomeFragment();
}
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
<b>//Not working: NPE on httpTask instance
mImages = httpTask.getImages();</b>
}
这就是WebTask类的样子。我期望使用getImages方法获取图像的ArrayList:
public class GetWebTask extends AsyncTask<Void, Void, ArrayList<Image>> {
private static final String TAG = "GetWebTask";
private WebConnection httpConnection;
private EndPoint endPoint;
ArrayList<Image> mImages;
public GetWebTask(WebConnection httpConnection, EndPoint endPoint){
this.httpConnection = httpConnection;
this.endPoint = endPoint;
}
@Override
protected ArrayList<Image> doInBackground(Void... params){
try{
mImages = endPoint.getXMLContent(httpConnection);
}catch (IOException ioe){
Log.e(TAG, "Failed to fetch URL Data: ", ioe);
return null;
}
return mImages;
}
@Override
protected void onPostExecute(ArrayList<Image> images){
this.mImages = images;
}
public ArrayList<Image> getImages(){
return this.mImages;
}
}
Dagger模块设置:
我的WebTask模块注入HomeActivity,扩展了BaseActivity。 BaseActivity是创建objectGraph的地方,getModules()方法包括ActivityModule和ConnectionModule。这些课程可以在这里找到:
基础应用程序模块和类同样位于我的Github Project上。我希望这个问题有道理。我真的只是想通过匕首和依赖注入来加快速度。谢谢!
答案 0 :(得分:0)
我认为你有一些错误注释类。您的github文件不再可用,因此无法检查
为了确保GetWebTask可以在其他类中注入,它的构造函数应该用@Inject注释,即使它是空的。如果在模块中提供该类的实例,则必须手动传入参数实例。
另外,正如我从代码中看到的那样,GetWebTask没有注入到HomeFragment中,因此它为null并且你得到了你的异常。
我强烈推荐Jake Wharthon在Dagger2上的演讲 - 谷歌,视频是免费的。 我还在Dagger2 for Android上写了几篇文章:http://aaverin.github.io/