0

Webからデータをダウンロードし、2秒で表示するアプリケーションを実装しましたActionBar.Tab。問題が1つあります。あるタブから別のタブに切り替えると、アプリケーションは別のダウンロードを開始し、ダウンロードが終了していない間、アプリはフリーズします。インターネット接続が遅い場合、それは非常に迷惑になります。ProgressDialogアプリがウェブからデータをダウンロードしていることをユーザーに表示するために、アプリに追加することにしました。ProgressDialogダウンロードを実行する実装を実装するコードを追加しましたAsyncTaskが、それは役に立ちませんでした。私はそれが起こる理由を理解していますが、それを修正する方法を見つけることができません:(

タブに収まるデータは、Fragmentクラスのインスタンスとして表されます。作成後のこのインスタンスはに追加され、オブジェクトをtransactionに追加した後にのみ、アプリは別のタブに切り替わります。mFragmenttransaction

これはtabListenerコードの一部です:

// ...

@Override
public void onTabSelected(Tab tab, FragmentTransaction transaction) {
    if (mFragment == null) {
        /*
         * Creation of ParkFragment is the reason why app locks!! Because in
         * ParkFragment data is being downloaded from web
         */
        mFragment = new ParkFragment(mUrl, mActivity);
        /*
         * mFragment can't be added to transaction until downloading is
         * finished, that's why app doesn't switch fast
         */
        transaction.add(android.R.id.content, mFragment, mTag);
    } else {
        transaction.attach(mFragment);
    }
}

ProgressDialogタブ間の切り替えの遅延を回避するための実装方法について誰かがアイデアを持っている場合は、それと共有してください。

読んでくれてありがとう。

更新:この質問への回答を読みましたが、その実装が遅延の管理にどのように役立つかを理解していませんでした:タブの変更は遅い/遅れています-フラグメントの使用

UPD:

public class ParkFragment extends ListFragment {
        private ArrayList<Cinemas> cinema;
        private CinemasAdapter cinemaAdapter;
        private String url;
        private Activity activity;


        public ParkFragment (String cinema,Activity activ){
            url = cinema;
            activity = activ;
        }

        public void onCreate(Bundle savedInstanceState){
            super.onActivityCreated(savedInstanceState); 
            cinema = new Handler().handle(url,activity);
            cinemaAdapter = new CinemasAdapter(activity, R.layout.movie_data_row, cinema);
            setListAdapter(cinemaAdapter);
        }

        @Override
        public void onListItemClick(ListView l, View v, int position, long id) {
            Cinemas movie = cinemaAdapter.getItem(position);
            Intent intent = new Intent (activity, More.class);
            intent.putExtra("Cinemas", movie);
            intent.putExtra("data", movie.getBitmap());

            Bundle translateBundle =
                   ActivityOptions.makeCustomAnimation(activity,
                   R.anim.slide_in_left, R.anim.slide_out_left).toBundle();
                   startActivity (intent, translateBundle);

        }
} 
4

1 に答える 1

1

で、ローダーと組み合わせてコンテンツプロバイダーParkFragmentを使用できます。データのダウンロードはサービスで処理する必要があります。完了すると、サービスはコンテンツプロバイダーを介してデータをDBに挿入します。そして、フラグメントでは、ローダーがデータをロードします。

AndroidエミュレーターにはAPIDemosという名前のアプリが1つあり、コンテンツプロバイダー/ローダー/サービスに関連するいくつかの例があります。そのソースコードは、AndroidSDKのAPIレベル[Android SDK]/samples/android-x/ApiDemosで入手できます。x

私はそう思いますが、のコードを共有できればParkFragment、おそらく別の問題がありますか?


編集済み

ParkFragmentで、(API 3以降で利用可能)を作成しResultReceiver、に入れて、をIntentダウンロード/処理するサービスを開始できますurl。サービスはのインスタンスを保持し、ResultReceiver完了すると、ダウンロードしたデータをを介してフラグメントに送り返しますsend(int, Bundle)。Aは、、、などのBundleプリミティブデータ型を保持できます。より複雑なデータの場合は、またはを実装するクラスを作成して保持します。Stringintbyte[]ParcelableSerializable

または、Bound Servicesを使用すると、フラグメント内からサービスのメソッドを直接呼び出すことができます。NetworkOnMainThreadExceptionサービスはメインUIスレッドで実行されるため、回避するには、サービスのようなものが必要であることに注意してThreadください。

于 2013-03-23T14:03:40.113 に答える