最近アクティビティをフラグメントに変換しました。AsyncTaskが実行されている間にフラグメントが置換されています - NullPointerException on getActivity()
Tab-Navigationと同様のものを使用して、ユーザーが別のタブを選択するとフラグメントが置き換えられます。 フラグメントが移入された後、少なくとも1つのAsyncTaskを起動して、インターネットから情報を取得します。しかし - ユーザーが別のタブに切り替えた場合、私のAsyncTaskからdoBackground-メソッドが実行されているだけのように - フラグメントががを交換しているので、私はマークされた行でNullPointerException
取得しています:
@Override
protected Object doInBackground(Object... params) {
...
String tempjson = helper.SendPost(getResources().getText(R.string.apiid)); //ERROR: Fragment not attached
...
}
protected onPostExecute(Object result) {
...
getActivity().getContentResolver() //NULLPOINTEREXCEPTION
getView().findViewById(R.id.button) //NULL
...
}
getActivity()
とgetResources()
を私のFragmentが置き換えられたためにエラーが発生します。私が試した
もの:
- を私のAsyncTaskのメソッドをキャンセル呼び出す(
onPostExecute()
が実行されている間の断片を交換した場合、最初のエラーでも2番目のエラーが修正されません) - チェックする場合
getActivity()
はnull
またはthis.isDetached()
呼び出すことである(ない本当の修正をして、私はそうでgetActivity()
を呼び出して、いつでも私はそれをチェックする必要があるだろう)
私の質問は次のとおりです。これらのAsyncTaskの問題を取り除くにはどうすればよいでしょうか?私はこれらの問題を、タブでの変更(タブでの変更で切り離されていない理由 - なぜフラグメントに切り替えるのか - 理由は私がフラグメントに切り替える理由)を使用していませんでした。
isDetachedあなた自身が明示的にフラグメントを切り離した場合にのみ、()を呼び出します。そうでなければ、システムがあなたのアクティビティとあなたのフラグメントとの間のリンクを破壊したケースを処理するためにisAdded()を使うべきです。 – pcans
@Nikolay Elenkovどのようにライフサイクルがgetactivityを呼び出す前に毎回チェックするのを避けることができますか? – Bear