尝试将单例注入Activity范围以与Fragment一起使用

时间:2015-04-09 16:01:31

标签: android dagger

我正在为我的活动创建一个扩展应用程序图的子图。我想在活动上实现单例的使用,以管理活动中片段使用的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。这些课程可以在这里找到:

BaseActivity

ActivityModule

ConnectionModule

基础应用程序模块和类同样位于我的Github Project上。我希望这个问题有道理。我真的只是想通过匕首和依赖注入来加快速度。谢谢!

1 个答案:

答案 0 :(得分:0)

我认为你有一些错误注释类。您的github文件不再可用,因此无法检查

为了确保GetWebTask可以在其他类中注入,它的构造函数应该用@Inject注释,即使它是空的。如果在模块中提供该类的实例,则必须手动传入参数实例。

另外,正如我从代码中看到的那样,GetWebTask没有注入到HomeFragment中,因此它为null并且你得到了你的异常。

我强烈推荐Jake Wharthon在Dagger2上的演讲 - 谷歌,视频是免费的。 我还在Dagger2 for Android上写了几篇文章:http://aaverin.github.io/