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中PagerAdapter总结

你如何扩展像Android.widget包中的DatePicker PagerAdapter这样的Android类?

如何在ViewPager中的各个Fragment间传递数据并刷新Fragment界面

Android开发技巧——ViewPager加View情况封装PagerAdapter的实现类

Android开发技巧——PagerAdapter实现类的封装