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