【问题标题】:Switching between ActionBar.Tabs issue在 ActionBar.Tabs 问题之间切换
【发布时间】:2013-03-13 07:40:13
【问题描述】:

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

将适合选项卡的数据表示为Fragment 类的实例。这个实例创建后会添加到transaction,只有在transaction添加mFragment对象后,app才会切换到另一个tab。

这是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以避免标签之间切换的延迟,请与它分享。

感谢您的阅读。

更新:我已阅读此问题的答案,但不明白该实施将如何帮助我管理延迟:Changing Tabs is Slow/Laggy - Using Fragments

更新:

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);

        }
} 

【问题讨论】:

    标签: android android-layout android-fragments android-actionbar android-progressbar


    【解决方案1】:

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

    在任何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 的内容。

    【讨论】:

    • 感谢您的回答!我添加了ParkFragment 的代码。我没有在我的应用程序中使用数据库。还有其他方法可以解决这个问题吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-26
    • 2022-01-16
    • 2018-09-03
    • 2019-04-29
    • 1970-01-01
    • 2012-02-04
    相关资源
    最近更新 更多