【问题标题】:Where to Async in PagerAdatperPagerAdapter 中的异步位置
【发布时间】: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 )
{
}

}

【问题讨论】:

    标签: android view android-asynctask adapter android-viewpager


    【解决方案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 会阻塞直到返回结果——即它不会异步发生。
      • 是的,我在这里回复几个小时后才意识到这一点。我有一个解析代码,如果它不在它自己的线程中,它就不能在冰淇淋三明治上工作。这是我的解决方案,我只是继续前进,因为它正在工作:)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-22
      • 1970-01-01
      • 1970-01-01
      • 2021-06-13
      • 2021-10-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多