Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
arvalon
21 / 6 / 2
Регистрация: 26.10.2012
Сообщений: 192
Записей в блоге: 1
1

Контекст равен null в АсинкТаске во фрагменте

29.12.2016, 18:05. Просмотров 283. Ответов 1

Хочу что бы при пересоздании Activity не исчезал DialogProgress со статусом выполняемого AsyncTask'а. Для этого AsyncTask вызываю во фрагменте с setRetainInstance(true). ProgressDialog создаётся в классе AsyncTask'а в onPreExecute. При вызове progress=new ProgressDialog(activity.get()) появляется ошибка
Код
Attempt to invoke virtual method 'android.content.res.Resources$Theme android.content.Context.getTheme()' on a null object reference
Код MainActivity
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
public class MainActivity extends AppCompatActivity {
 
@BindView(R.id.counter)TextView counter;
private MyAsyncTask2 task;
private static final String MyFragment="MyFragment";
 
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    ButterKnife.bind(this);
}
 
@OnClick(R.id.progressDialogButton)
public void showProgressDialog(){
    Log.d("happy","showProgressDialog()");
    task=new MyAsyncTask2(MainActivity.this);
    task.execute();
}
 
@OnClick(R.id.progressFragmentDialogButton)
public void showFragmentProgressDialog(){
    FragmentTaskWrapper myFragment=(FragmentTaskWrapper)
            getSupportFragmentManager().findFragmentByTag(MyFragment);
    if(myFragment==null){
        myFragment=new FragmentTaskWrapper();
        getSupportFragmentManager().beginTransaction().add(myFragment,MyFragment).commit();
    }
    myFragment.startProgress();
}
 
@Override
protected void onPause() {
    super.onPause();
    if(task!=null)task.cancel(false);
}
}

Код FragmentTaskWrapper
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
public class FragmentTaskWrapper extends Fragment {
 
private MyAsyncTask2 task;
 
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setRetainInstance(true);
    Log.d("happy","FragmentTaskWrapper - onCreate");
}
 
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    Log.d("happy","FragmentTaskWrapper - onCreateView");
    return super.onCreateView(inflater, container, savedInstanceState);
 
}
 
@Override
public void onAttach(Context context) {
    Log.d("happy","FragmentTaskWrapper - onAttach");
    super.onAttach(context);
    task.setActivity((MainActivity)getActivity());
}
 
@Override
public void onDetach() {
    super.onDetach();
    task.setActivity(null);
}
 
public void startProgress(){
    Log.d("happy","FragmentTaskWrapper - startProgress");
    task=new MyAsyncTask2((MainActivity)getActivity());
    task.execute();
}
}

Код MyAsyncTask2
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
public class MyAsyncTask2 extends AsyncTask<Void,Integer,Void> {
 
private WeakReference<MainActivity>activity;
private ProgressDialog progress;
 
public MyAsyncTask2(MainActivity activity) {
    Log.d("happy","MyAsyncTask2 - constructor");
    this.activity = new WeakReference<MainActivity>(activity);
}
 
public void setActivity(MainActivity activity){
    if (activity!=null){
        this.activity=new WeakReference<MainActivity>(activity);
    }
    else{
        this.activity=null;
    }
 
}
 
@Override
protected void onPreExecute() {
    Log.d("happy","MyAsyncTask2 - onPreExecute");
    if (activity!=null){
        Log.d("happy","MyAsyncTask2 - onPreExecute IF activity != null");
        progress=new ProgressDialog(activity.get());
        progress.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        progress.setTitle("Progress Dialog");
        progress.setIndeterminate(false);
        progress.setProgress(0);
        progress.setMax(9);
        progress.setCancelable(false);
        progress.show();
    }
}
 
@Override
protected Void doInBackground(Void... params) {
    Log.d("happy","MyAsyncTask2 - doInBackground");
    for (int i=0;i<10;i++){
        try {
            Thread.sleep(500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        publishProgress(i);
    }
    return null;
}
 
@Override
protected void onProgressUpdate(Integer... values) {
    Log.d("happy","MyAsyncTask2 - onProgressUpdate");
    progress.setProgress(values[0]);
}
 
@Override
protected void onPostExecute(Void aVoid) {
    Log.d("happy","MyAsyncTask2 - onPostExecute");
    if (progress!=null){
        progress.dismiss();
    }
}
}

NPE в классе MyAsyncTask2 в методе onPreExecute
Java
1
progress=new ProgressDialog(activity.get());
Замена на activity.get().getApplicationContext() не даёт эффекта, тот же NPE. Логирующие сообщения в проовераденных методах фрагмента и AsyncTask'a выводятся в следующем порядке:
  • FragmentTaskWrapper - startProgress
  • MyAsyncTask2 - constructor
  • MyAsyncTask2 - onPreExecute
  • MyAsyncTask2 - onPreExecute IF activity != null
Т.е. у фрагмента вообще не вызываются методы
  • onCreate
  • onCreateView (проверрадил тоже, хоть тут headless-фрагмент без разметки, по идее этот метод вообще никак не нужен)
  • onAttach
а сразу вызывается startProgress. Не понимаю в итоге как вообще этот фрагмент заработал. Далее в AsyncTask'е отдельная проверка на null поля activity проходит в методе onPreExecute но далее из этого поля не могу достать контекст.
Почитал про фрагменты поподробнее, да, написано что пока не выполнятся методы onCreate (и/или onCreateView?) этого фрагмента "не существует".

Но как тогда в AsyncTask'е Activity не равна null?
И главное как передать активити или контекст в AsyncTask что бы ProgressDialog можно было создать?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.12.2016, 18:05
Ответы с готовыми решениями:

Вывод во втором фрагменте длины текста, введённого в первом фрагменте активити
Создать активити с двумя фрагментами. В первый фрагмент должен содержать поле...

GridView.Rows[i].DataItem равен null
здравствуйте. подскажите, что я делаю не так: вот мой ObjectDataSource...

Параметр кнопки Image равен null
Здравствуйте. Столкнулся с некоторой проблемой. Есть у меня массив кнопок...

OperationContext.Current.ServiceSecurityContext равен null
Использую basicHttpBinding. Пытаюсь получить доступ к ServiceSecurityContext...

Указатель при инициализации не равен NULL
Здравия желаю!:) myClass myClass::operator=(myClass iniOb) { char...

1
klim76
20 / 14 / 2
Регистрация: 10.06.2016
Сообщений: 144
29.12.2016, 22:24 2
кмк в дестройвью во фрагменте надо дотвязать фрагмент от активити,
что то типо такого:
getActivity.getSupportFragmentManager().beginTransaction().remove(myFragment,MyFragment).commit();
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.12.2016, 22:24

Ошибка на проверке ASSERT: m_hWnd равен NULL
Такая проблемка: есть MDI приложение, дочерняя форма (скажем CView1) с разными...

Почему Tag для изображения из ImageList равен null?
собственно пример говорит сам за себя. студия 2005, фреймворк 2,0 сп1+сп2 ...

При каких условиях свойство Response равен null
Народ такая ситуация, хочу установить куки через метод Response.SetCookie, но...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru