В настоящее время я создаю дочерний граф для своей деятельности, который расширяет граф приложения. Я хочу реализовать использование синглетонов в действии для управления веб-задачей, которая используется фрагментом в действии.
Проблема: я не могу получить одноэлементный экземпляр 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. Эти классы можно найти здесь:
Модуль базового приложения и класс также расположены на моем Проект Github. Я надеюсь, что этот вопрос имеет смысл. Я действительно просто пытаюсь набрать скорость с помощью кинжала и внедрения зависимостей. Спасибо!