3

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
    }
........    
    }
}
4

3 に答える 3

1

フラグメントを使用している場合は、代わりにローダーを使用する必要があります。ドキュメントを確認してください:

http://developer.android.com/reference/android/app/LoaderManager.html

フラグメントは以前に作成されたローダーを検出して「再接続」するため、フラグメントから結果を取得できます。

AsyncTasksを「再接続」する方法もありますが、ローダーを使用する方がよいでしょう。

于 2012-11-27T20:30:53.117 に答える