Android 刷新异步任务中的片段

Android 刷新异步任务中的片段,android,android-fragments,android-asynctask,android-viewpager,Android,Android Fragments,Android Asynctask,Android Viewpager,我的结果应该类似于在每个片段中显示图像和文本。 我在视图寻呼机中使用片段 由于图像是高分辨率的,我使用异步任务下载它并保存在SD卡中 如果图像被下载,我的代码工作正常,如果图像不在那里,在下载图像后,片段不会被刷新,因此图像不会被显示。如何在完成图像下载后刷新片段 我在活动中设置片段的代码是 ExtendedViewPager pager = (ExtendedViewPager) findViewById(R.id.view_pager); /** Getting fragme

我的结果应该类似于在每个片段中显示图像和文本。 我在视图寻呼机中使用片段

由于图像是高分辨率的,我使用异步任务下载它并保存在SD卡中

如果图像被下载,我的代码工作正常,如果图像不在那里,在下载图像后,片段不会被刷新,因此图像不会被显示。如何在完成图像下载后刷新片段

我在活动中设置片段的代码是

   ExtendedViewPager pager = (ExtendedViewPager) findViewById(R.id.view_pager);

    /** Getting fragment manager */
    FragmentManager fm = getSupportFragmentManager();

    /** Instantiating FragmentPagerAdapter */
    pagerAdapter = new MyGalleryPagerAdapter(fm,eventArrayList);

    /** Setting the pagerAdapter to the pager object */
    pager.setAdapter(pagerAdapter);
    pager.setOnPageChangeListener(new MyPageChangeListener());
    pager.setCurrentItem(currentpage);
我的适配器代码是

public class MyGalleryPagerAdapter extends FragmentStatePagerAdapter implements{
 public static int mCurrentPage;
/** Constructor of the class 
 * @param eventArrayList */
ArrayList<EventsGalleryDetails> events;
public MyGalleryPagerAdapter(FragmentManager fm, ArrayList<EventsGalleryDetails>    eventArrayList) {
    super(fm);
    events=eventArrayList;
}

/** This method will be invoked when a page is requested to create */
@Override
public Fragment getItem(int arg0) {
    System.out.println("Get Item");
    MyGallery myFragment = new MyGallery();
    Bundle data = new Bundle();
    data.putInt("current_page", arg0);
    myFragment.setArguments(data);
    mCurrentPage = arg0;
    return myFragment;
}

public int currentItem(){
    return mCurrentPage;
}

public int getItemPosition(Object item) {
        return POSITION_NONE;

}
/** Returns the number of pages */
@Override
public int getCount() {     
    return events.size();
}
我的片段代码是

 public class MyGallery extends Fragment implements OnPageChangeListener{
ImageLoader imageLoader;
int mCurrentPage;
Bitmap bm ;
public static final String TAG = "MyGallery";
private LruCache<String, Bitmap> mMemoryCache;
private HashMap<Integer, TouchImageView>hmap = new HashMap<Integer, TouchImageView>();
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    imageLoader=new ImageLoader(getActivity());
    Bundle data = getArguments();
    mCurrentPage = data.getInt("current_page", 0);
    final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);

    // Use 1/8th of the available memory for this memory cache.
    final int cacheSize = maxMemory / 8;
    mMemoryCache = new LruCache<String, Bitmap>(cacheSize);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    Bundle data = getArguments();
    mCurrentPage = data.getInt("current_page", 0);
    View v = inflater.inflate(R.layout.gallerysecondscreenitem, container,false);               
    TouchImageView img = (TouchImageView)v.findViewById(R.id.galleryimage);
    TextView txt = (TextView ) v.findViewById(R.id.gallerytext);
    hmap.put(mCurrentPage, img);
    if(new File(Constants.Path+".jpg").exists()){
        loadBitmap(img);
        bm = null;
        img = null;
    }else{
        img.setImageResource(R.drawable.gallery_icon);
    }
    txt.setText(GallerySecondScreen.eventArrayList.get(mCurrentPage).getTitle());
    return v;       
}
public void loadBitmap(TouchImageView mImageView) {
     final String imageKey = String.valueOf(mCurrentPage);

        final Bitmap bitmap = mMemoryCache.get(imageKey);
        if (bitmap != null) {
            mImageView.setImageBitmap(bitmap);
        } else {
            mImageView.setImageResource(R.drawable.gallery_icon);
            BitmapWorkerTask task = new BitmapWorkerTask();
            task.execute(mImageView);
        }
}
我的任务是拍摄乐定形象

         private class DownloadImageTask extends AsyncTask<Integer, Integer, Integer>{
          @Override
    protected Integer doInBackground(Integer... values) {
        try {
            for(int j=0;j<eventArrayList.size();j++){
                if(!new File(Constants.Path+".jpg").exists()){
                         downloadImageFromServer(eventArrayList.get(j).getImage(), ""+pos,""+j);
                    publishProgress(j);
                    //Log.d("Image will be downloaded from server now..", "the "+values[0]);
                }else{
                    publishProgress(j);
                }

            }
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();

        }
        Log.d("value of j:",""+j);
        return j;
    }}

请建议一种在完成图像下载后刷新视图的方法

尝试this.getView.draw如果它们不适用于您,请尝试requestLayout或forceLayout

这里的问题是寻呼机适配器未刷新。已传递给BitmapWorkerTask的ImageView将在图像下载后更新,但您必须找到一种方法,使用pagerAdapter中的notifyDataSetChanged更新pagerAdapter。首先,您需要从BitmapWorkerTask创建回调,以便在下载完成后通知片段。然后,您必须为PagerAdapter提供一个侦听器,一旦触发,它将调用notifyDataSetChanged方法。

我使用相同的PagerAdapter.notifyDataSetChanged解决了这个问题。我不是每次都调用它,而是在当前视图的图像被下载时才调用它

这是我修改的OnprogressUpdate

    @Override
    protected void onProgressUpdate(Integer... values) {
        super.onProgressUpdate(values);
        System.out.println("Downloaded "+values[0]);
        if(values[0] == mPager.mCurrentPage){
            pagerAdapter.notifyDataSetChanged();
        }
    }

这个.getView.draw函数不是用来覆盖和请求布局或强制布局不工作的。您不需要覆盖它来调用它。如果这对您不起作用,唯一的选择是删除片段并将其重新添加到您的片段事务中。事务的提交调用将触发片段的重新加载。我尝试在progressupdate上调用pageradapter.notifydatasetchanged。它是在完成图像下载后设置图像,但对于每次图像下载,屏幕都会一次又一次地刷新,直到下载完成{//WAY1//Reload current fragment/*MyGallery frg=new MyGallery;final FragmentTransaction ft=getSupportFragmentManager.beginTransaction;Bundle data=new Bundle;data.putincurrent\u page,pagerAdapter.currentItem;frg.setArgumentsdata;ft.detachfrg;ft.commit;*///WAY 2//pagerAdapter.notifyDataSetChanged;//方式3//pagerAdapter.getItemMyGalleryPagerAdapter.McCurrentPage;}好的,如果notifyDataSetChanged对您有效,请尝试这样做。不要为每次图像下载创建新的异步任务,而是尝试成批执行。我也有类似的问题,但数据不是图像。我将listview设计为一次加载8行,并将所有8行作为一个批加载到一个加载程序中。性能显著提高。嗨,bitmapworker测试仅用于解码图像文件,该文件将在片段的oncreateview中调用。问题是oncreateview本身未被调用在pagerAdapter刷新之前不会调用CreateView,但在前面的评论中,我看到您不希望在onProgressUpdate中刷新pagerAdapter,以避免在屏幕上多次刷新。您可以保留在pagerAdapter中引用当前项目片段,并在需要时手动调用并更新片段中的视图这是我以前帖子中发布的解决方案,请验证这是不公平的。您通过复制@Chetu reply发布答案并标记为已回答。您应该已经接受Chetu的回复。