2

私はいくつかの画像をダウンロードしてスライドショーを開始する必要があるAndroidアプリに取り組んでいます。画像をダウンロードするには、AsynTask を使用しています。画像がダウンロードされるとすぐに、ハンドラーを使用してスライド ショーを開始します。しかし、向きの変更中はハンドラーを制御できません。ハンドラー オブジェクトは AsyncTask クラスで定義されているためです。

以下は、私が行ったことの大まかなシナリオです。

クラス A はアクティビティを拡張します

クラス B async = new ClassB(this);

async.execute();

クラス B は AsyncTask を拡張し、OnPageChangeListener、OnTouchListener を実装します

onPreExecute() -------このメソッドには何もありません

doInBackground -------ここから画像をダウンロードしています

onPostExecute ---------Handler はここから開始され、スライド ショーを実装するために 5 秒ごとに実行されます

今問題:

向きの変更中に、AsyncTask が 1 回だけ呼び出されるか、画像が再度ダウンロードされるようにしました。これは、向きの変更中にハンドラーが実行されていないためです。

開始された最初のハンドラー オブジェクトは実行を続けますが、変更は画面に反映されません。

AsyncTask を使用して画像をダウンロードする方法で実装することを考えていました。ダウンロードが完了すると、ClassA にフォーカスが置かれ、ハンドラーが ClassA に実装されます (画像がダウンロードされた場合のみ)。

4

3 に答える 3

0

メソッドから呼び出すメソッドを、Activity呼び出し元に。を使用して作成するだけです。startSlideShow(position)onPostExecute()startSlideShow(0)

向きを変更したら、現在のスライドショーの位置とダウンロードした画像を保存してonCreate(Bundle savedInstance)から、を使用して前の位置からスライドショーを開始しますstartSlideShow(restoredPosition);

于 2012-07-05T10:35:30.653 に答える
0

向きが変わったときにアクティビティが再起動することが問題の原因である場合、アクティビティの AndroidManifest.xml エントリに android:configChanges="orientation" を設定することを検討しましたか?

次に、UI の更新 (別のレイアウトへの切り替えなど) を実行する必要がある場合は、onConfigurationChanged(Configuration) を処理して自分で実装できます。

于 2012-07-05T10:53:16.413 に答える
0

インターフェイス クラスの命名は、私の場合に基づいています。要件に応じて調整してください。ArtikelDetailsDataLoader私の非同期タスク。詳細が読み込まれていることをアクティビティに伝えます。

あなたのクラスBで

public interface OndetailsLoadInterface {
    public void onDetailsLoad(ArtikelDetailsInfo artikelDetails);
}

OndetailsLoadInterface detailsLoaderInterface;

public void setOnDetailsLoadListener(OndetailsLoadInterface detailsLoader) {
    detailsLoaderInterface = detailsLoader;
}

そしてonPostExecute

detailsLoaderInterface.onDetailsLoad(artikelDetails);

そしてAクラスで

ArtikelDetailsDataLoader mLoader = new ArtikelDetailsDataLoader( items.get(position).getId(), mContext); mLoader.setOnDetailsLoadListener(mLoaderLisnter);

OndetailsLoadInterface mLoaderLisnter = new OndetailsLoadInterface() {

        @Override
        public void onDetailsLoad(ArtikelDetailsInfo artikelDetails) {
            //do slide show

        }

    };
于 2012-07-05T10:32:51.237 に答える