android在视图寻呼机中异步加载数据

时间:2012-05-22 13:30:48

标签: android android-asynctask android-viewpager

我需要一个查看分页器实现的解决方案。 首先,我在单页中从数据库加载大量数据,因此有时在刷卡期间它会减慢刷卡频率(您需要在页面上多次刷卡),因为它在后台正在执行提取任务。 我没有使用异步任务返回视图。 是否有任何方法来延迟加载页面只允许用户在刷卡上转到其他页面但数据是延迟加载的。

我的代码示例如下;

 public Object instantiateItem(View container, int position) {

View v;

v = View.inflate(context,R.layout.swipearea, null);

listView = (ListView)v.findViewById(R.id.MyListView);
largeDataCall();
((ViewPager)container).addView(v);
return v;
}

我在创建方法中调用它。

pager=(ViewPager) findViewById(R.id.pagerAdapter);
pager.setAdapter(new SimplePager(MyPager.this));
pager.setCurrentItem(364);

有没有解决方案?

6 个答案:

答案 0 :(得分:17)

我建议使用Fragments(而不是直接使用视图)。

你的片段上需要一个界面来告诉他们何时显示它们:

public interface IShowedFragment {

    public void onShowedFragment();
}

让所有片段实现该接口,并在该方法中调用你的loaders / asyncTasks /后台任务。

然后在ViewPager上放置一个onPageChangeListener,当您检测到用户更改了页面时,请调用片段上的interface方法。您可以选择使用此侦听器,其中一种方法是等待viewPager停止滑动以触发您的接口调用。

为了能够获得正确的片段来进行此调用,请从yourFragmentApadter.instantiateItem(ViewGroup,int)中获取片段,如果片段已经加载,它将返回该片段的片段。

mPager.setOnPageChangeListener(new OnPageChangeListener() {

  @Override
  public void onPageSelected(int position) {

      Fragment fragment = (Fragment) mAdapter.instantiateItem(mPager, position);
      if(fragment instanceof IShowedFragment){
           ((IShowedFragment) fragment).onShowedFragment();
      }
  }
  (...)

就像那样,您可以使用空视图准备片段,当您在其中滑动时,就会开始加载数据。

答案 1 :(得分:3)

我刚刚完成了一项非常类似的任务。为了帮助您找到解决问题的方法,请按顺序考虑以下几点;

  1. 看一下你是否需要在第一个实例中获取所有的数据。您可以随时回复一些详细信息,了解您需要加载哪些信息以及您正在使用它做什么(在屏幕上将其显示为列表?)
  2. 使用CursorLoader来执行繁重的任务,例如异步执行数据库提取。互联网上的This tutorial介绍了ContentProvider Android方法。最好熟悉官方的Android URI和ContentProvider文档,如果这些术语没有多大意义的话。
  3. 如果您正在使用片段 - 请使用FragmentStatePagerAdapter代替传统的FragmentPagerAdapter。我没有使用过这个适配器,但我读过它只实例化当前可见的片段,即不是当前所选标签右侧或左侧的那些片段。
  4. 查看针对数据库优化您正在运行的查询。

答案 2 :(得分:1)

instantiateItem即将交换并需要视图时,会调用

ViewPager 实际创建所有内容。我认为最终,懒惰加载已经结束。我看到它的方式,你需要做两件事。

1: 当用户即将到达您的页面时,在后台缓存数据。你的例子声称有364页(好主),所以我会说使用一个监听器来处理页面更改。当您在第363页时,开始加载364的数据。当您处于364时,开始在365处加载数据并将数据保持在363以防用户想要交换回来。如果数据加载速度相对较快或者用户需要很长时间才能进行交换,那么假设您使用asyncTask或线程来加载数据,这应该是无用的。

2:备份默认视图在检索数据之前不会填充。如果用户在检索数据之前加载页面,您还需要使用选项1执行此操作。基本上,只有一个视图,说“加载......”或其他东西,直到你有数据。要么是这样,要么在获得数据时实时填充数据。在这种情况下,用户将看到它构建。

无论哪种方式,我认为你需要缓存一些东西才能使应用看起来很好。

答案 3 :(得分:1)

我有类似的问题。正在加载大量数据的viewpager。如果您不打算经常更改各个页面的视图,那么我建议您将页面保留在内存中。使用以下代码执行此操作

mViewPager.setOffscreenPageLimit(#pages); to keep #pages in memory. I had 5 pages so my #pages was 4. 

如果要刷新viewpager幻灯片上的数据,请使用

mViewPager.getAdapter().notifyDataSetChanged(); with getItemPosition() returning POSITION_NONE.

并使用FragmentStatePagerAdapter。

答案 4 :(得分:0)

我认为没有任何方法可以以您描述的同步方式延迟加载数据。 AsyncTask是要走的路,或者你可以直接使用线程。我相信AsyncTask是专门为这种功能而设计的。直接使用线程更容易。如果您需要有关实施的想法,请查看: http://geekjamboree.wordpress.com/2011/11/22/asynctask-call-web-services-in-android/

答案 5 :(得分:0)

你有没有看过android ignition library?根据{{​​3}},有一个组件“Endless List”和一个http-cache组件。

我自己没有尝试过,也不知道这是否适合你 - 只看了例子......