PagerAdapter 中的异步位置
Posted
技术标签:
【中文标题】PagerAdapter 中的异步位置【英文标题】:Where to Async in PagerAdatper 【发布时间】:2012-11-22 08:00:16 【问题描述】:我的片段活动使用此适配器在列表视图中显示所有结果。 该页面将有一个标题选项卡,每个选项卡都有列表结果。 现在我从内部存储中读取的列表结果,每次我滑动到下一页时都会有轻微的滞后或延迟,所以我正在考虑在这个 pageradapter 中实现 ASYNCTask,这样体验会更好,但我不知道在哪里实施。大佬能指点一下吗??
public class ViewPagerAdapter extends PagerAdapter
public ViewPagerAdapter( Context context )
//This is where i get my title
for (HashMap<String, String> channels : allchannel)
String title = channels.get(KEY_TITLE);
titles[acc] = title;
acc++;
scrollPosition = new int[titles.length];
for ( int i = 0; i < titles.length; i++ )
scrollPosition[i] = 0;
@Override
public String getPageTitle( int position )
return titles[position];
@Override
public int getCount()
return titles.length;
@Override
public Object instantiateItem( View pager, final int position )
String filename = null;
ListView v = new ListView( context );
final ArrayList<HashMap<String, String>> items = new ArrayList<HashMap<String, String>>();
DatabaseHandler db = new DatabaseHandler(context);
filename = openFile("PAGE1"); //OpenFile function is read file from internal storage
switch(position)
case 0:
filename = openFile("PAGE1");
break;
case 1:
filename = openFile("PAGE2");
break;
case 2:
filename = openFile("PAGE3");
break;
try
//Use json to read internal storage file(Page1/Page2) and display all the result on the list
catch(Exception e)
ListAdapter listadapter=new ListAdapter(context, items);
v.setAdapter( listadapter );
((ViewPager)pager ).addView( v, 0 );
return v;
@Override
public void destroyItem( View pager, int position, Object view )
( (ViewPager) pager ).removeView( (ListView) view );
@Override
public boolean isViewFromObject( View view, Object object )
return view.equals( object );
@Override
public void finishUpdate( View view )
@Override
public void restoreState( Parcelable p, ClassLoader c )
if ( p instanceof ScrollState )
scrollPosition = ( (ScrollState) p ).getScrollPos();
@Override
public Parcelable saveState()
return new ScrollState( scrollPosition );
@Override
public void startUpdate( View view )
【问题讨论】:
【参考方案1】:我建议这样做
@Override
public Object instantiateItem( View pager, final int position )
//Some other work related to instantiation of item
AsyncTask<Uri, Void, Bitmap> mLoadTask = new AsyncTask<Uri, Void, Bitmap>()
//async task for loading images in background
@Override
protected void onPostExecute(Bitmap result)
pageview[position].setImageBitmap(result);
//post in ui thread
//this way you have a reference object for each item(using position)
//and hence you can start several tasks at the same time
@Override
protected Bitmap doInBackground(Uri... params)
Bitmap bitmap=getBitmap(params[0]);
//here getBitmap returns the bitmap using uri arguement
return bitmap;
;
mLoadTask.execute(Uri.withAppendedPath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "" + image_id));
这样每个项目都有自己的线程,无论加载多少项目,您都不必担心。
编辑还有一件事,您可以在 AsyncTask 代码之后立即从此方法返回 pageview[position],这样在 AsyncTask 完成后台工作之前,视图将显示为空白(实现平滑滚动)。但它仍然能够将位图设置为正确的视图,因为它在 onPostExecute
内部有引用
【讨论】:
【参考方案2】:我在构造函数中做它,它工作正常。示例:
public MyAdapter(Context context)
this.context = context;
try
whatIneed = new DoSomeAsyncStuff(this.context).execute().get();
catch (InterruptedException e)
// TODO Auto-generated catch block
e.printStackTrace();
catch (ExecutionException e)
// TODO Auto-generated catch block
e.printStackTrace();
【讨论】:
您确实意识到调用get
会阻塞直到返回结果——即它不会异步发生。
是的,我在这里回复几个小时后才意识到这一点。我有一个解析代码,如果它不在它自己的线程中,它就不能在冰淇淋三明治上工作。这是我的解决方案,我只是继续前进,因为它正在工作:)以上是关于PagerAdapter 中的异步位置的主要内容,如果未能解决你的问题,请参考以下文章
在使用 PagerAdapter 和 ViewPager 中的选项卡之间滑动时出现问题
你如何扩展像Android.widget包中的DatePicker PagerAdapter这样的Android类?
如何在ViewPager中的各个Fragment间传递数据并刷新Fragment界面