Fragmentコンテナ(Tab上)を介していくつかのフラグメント(実際には3つ)を開くアプリがあり、最初のフラグメントはAsyncTaskを使用してフィードをアプリにダウンロードします。この問題は、画面の回転があるときに発生します - アプリケーションがクラッシュします。PostExecute からのデータをプライベートな静的変数にロードすることで一時的にこの問題を処理しますが、この問題はユーザーが最初にアプリに入ったときにまだ発生する可能性があります。
これは非常に一般的または横行する問題のようですが、ここで完全な解決策を見つけることができませんでした. これは、AsyncTask が UI スレッドへの並列スレッドで実行されているため、画面の回転による構成の変更が原因であることを理解しています。AsyncTask には既製のツールがあるように見えるため、この段階では Java スレッド/エグゼキューター/エグゼキューター サービスの使用を控えます。
アクティビティまたはフラグメントを正常に再起動し、最初の後続の AsyncTask 呼び出しを破棄するために、プロセスを中断できませんでした..
つまり、画面の回転などの継続的な構成変更があった場合に、フラグメント内の AsyncTask を破棄するにはどうすればよいですか。どうぞよろしくお願いいたします。
public class MolyListFragment extends Fragment {
public final static String MOLY_ARTICLE_DATA = "No Details";
private static final String TAG = "MOLY";
private static ArrayList<MolyPg> mMolyPgs = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
if (mMolyPgs == null) {
new MolyLoadTask().execute(getResources().getString(R.string.mly_feed));
}
else
displayMlicles (mMolyPgs); //this displays the arrayList out of static mMolyPgs
}
private class MolyLoadTask extends AsyncTask<String, Void, ArrayList<MolyPg>> {
@Override
protected ArrayList<MolyPg> doInBackground(String... urls) {
String myUrl = urls[0];
ArrayList<MolyPg> myMlPgs = null;
try {
myMlPgs = loadXmlFromNetwork(myUrl);
} catch (MalformedURLException e) {
Log.d(TAG, "MalformedURLException", e);
} catch (IOException e) {
getResources().getString(R.string.connection_error);
} catch (XmlPullParserException e) {
getResources().getString(R.string.xml_error);
}
return myMlPgs;
}
@Override
protected void onPostExecute(ArrayList<MolyPg> result) {
super.onPostExecute(result);
Do some acrobatics here
}
........
}
}