繁体   English   中英

在ActionBar.Tabs问题之间切换

[英]Switching between ActionBar.Tabs issue

我实现了从Web下载数据,然后在两个ActionBar.Tab显示数据的应用程序。 我有一个问题。 如果我从一个选项卡切换到另一个选项卡,则应用程序将开始另一次下载,而下载未完成时,该应用程序将冻结。 如果互联网连接缓慢,它将变得非常烦人。 我决定将ProgressDialog添加到应用程序,以向用户显示该应用程序正在从Web下载数据。 我向AsyncTask添加了一段实现ProgressDialog的代码,该代码执行下载,但这没有帮助。 我了解为什么会发生这种情况,但找不到解决方法的方法:(

将适合选项卡的数据表示为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);

        }
} 

ParkFragment您可以将内容提供程序加载 程序结合使用。 下载数据应在服务中处理,完成后该服务将通过内容提供程序将数据插入DB。 并且在您的片段中,加载器将加载数据。

任何Android模拟器中都有一个名为API Demos的应用程序,其中有一些与内容提供商/加载程序/服务相关的示例……其源代码可在Android SDK中找到,位于: [Android SDK]/samples/android-x/ApiDemos ,其中x是API级别。

我只是这么认为,但是如果您可以共享ParkFragment的代码,也许还会有另一个问题?


已编辑

在您的ParkFragment ,您可以创建一个ResultReceiver (在API 3+中可用),将其放入Intent并启动服务以下载/处理url 该服务保留ResultReceiver的实例,完成后它将通过send(int, Bundle)将下载的数据发送回您的片段。 Bundle可以保存原始数据类型,例如Stringintbyte[] ……对于更复杂的数据,您可以创建一个类来保存它,该类实现ParcelableSerializable

或使用Bound Services ,您可以直接从片段中调用服务的方法。 请注意,服务在主UI线程上运行,因此为了避免NetworkOnMainThreadException ,您需要在服务中添加诸如Thread东西。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM