Попытка внедрить синглтон в область действия для использования с фрагментом

В настоящее время я создаю дочерний граф для своей деятельности, который расширяет граф приложения. Я хочу реализовать использование синглетонов в действии для управления веб-задачей, которая используется фрагментом в действии.

Проблема: я не могу получить одноэлементный экземпляр WebTask (который был внедрен в HomeActivity с помощью моего ConnectionModule) в HomeFragment.

Пока у меня есть WebTask AsyncTask, работающий над получением xml из Flickr API следующим образом:

-Внедрить GetWebTask

-выполнить асинхронную задачу

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();
    }
}

Это выполнит метод doInBackground в GetWebTask, который возвращает ArrayList содержимого XML из метода getXMLContent в EndPoint. Я отладил это, и переменная-член mImages (ArrayList) действительно содержит данные.

Попытка и вытекающая из нее ошибка

Попытка использовать тот же экземпляр WebTask в HomeFragment дает мне ошибку NullPointerException. Я предположил, что, поскольку я внедрил WebTask в Activity и выполнил метод, как показано выше, у меня будет тот же экземпляр (httpTask) WebTask, содержащий его переменную-член 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. Я ожидаю получить ArrayList изображений с помощью метода getImages:

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. Я надеюсь, что этот вопрос имеет смысл. Я действительно просто пытаюсь набрать скорость с помощью кинжала и внедрения зависимостей. Спасибо!


person Futureproof    schedule 09.04.2015    source источник
comment
Вы также можете внедрить задачу во фрагмент, если он одноэлементный   -  person Eugen Martynov    schedule 15.04.2015


Ответы (1)


Я думаю, у вас есть некоторые ошибки, аннотирующие классы. Ваши файлы github больше не доступны, поэтому не могу проверить

Чтобы убедиться, что GetWebTask доступен для внедрения в другие классы, его конструктор должен быть аннотирован с помощью @Inject, даже если он пуст. Если вы предоставляете экземпляры этого класса в модуле, вам придется передавать экземпляры параметров вручную.

Кроме того, как я вижу из кода, GetWebTask не внедряется в HomeFragment, поэтому он равен нулю, и вы получаете свое исключение.

Я настоятельно рекомендую выступление Джейка Уортона на Dagger2 — погуглите, видео бесплатное. У меня также есть пара статей о Dagger2 для Android здесь: http://aaverin.github.io/

person AAverin    schedule 21.09.2015