2013-08-31 87 views
0

我正在实现一个DrawerLayout,并且其中一个项目 或者抽屉的菜单显示的图像也是一个片段。在显示片段之前执行AsyncTask

问题是,当我点击该项目时,在显示图像的网格 之前存在此延迟或滞后。

一直在寻找这一点,我想有一个AsyncTask确保GridView的片段 应该显示我需要有一个ProgressDialog,以防止滞后 效果或掩盖之前完全加载视图。如何检查片段是否准备好显示? 我如何处理AsyncTask?提前致谢。

  ImageGridActivity fragment = new ImageGridActivity(); 

      FragmentTransaction ft = getChildFragmentManager().beginTransaction(); 
      ft.replace(R.id.fragment_planet_replace, fragment); 

        Bundle args = new Bundle(); 
        args.putStringArray(Extra.IMAGES, Constants.IMAGES); 
        fragment.setArguments(args); 

      ft.addToBackStack(null); 
      ft.commit(); 

编辑:

I am using an `ImageAdapter` to populate the images to the listview. 
        `listView.setAdapter(new ImageAdapter());` 

我使用通用-图片下载器来处理图像的下载和显示它。 imageLoader.displayImage

回答

0

你可以推出一个新AsyncTask是下载在其doInBackground方法图像(它运行在后台线程),并在其onPostExecute方法驳回ProgressDialog(运行在UI线程)。

例如,在你的活动:

final Dialog progressDialog = ProgressDialog.show(this, title, message); 
//Should use DialogFragment to wrap the ProgressDialog 

new AsyncTask<String, Void, List<byte[]>>(){ 

    @Override 
    protected List<byte[]> doInBackground(String... urls) { 
     List<byte[]> imageList = new ArrayList<byte[]>(); 
     HttpURLConnection conn = null; 
     byte[] buffer = new byte[BUFF_SIZE]; 
     ByteArrayOutputStream byteBuffer = new ByteArrayOutputStream(BUFF_SIZE); 
     //Add try - catch - finally block 
     for(String targetUrl : urls){ 
      conn = (HttpURLConnection)new URL(targetUrl).openConnection(); 
      InputStream iStream = new BufferedInputStream(conn.getInputStream()); 
      int len = 0; 
      //Alternatively could use Apache Commons IO 
      while ((len = iStream.read(buffer)) >= 0) { 
       byteBuffer.write(buffer, 0, len); 
      } 
      imageList.add(byteBuffer.toByteArray()); 
      byteBuffer.reset(); 
     } 
     return imageList; 
    } 

    @Override 
    protected void onPostExecute(List<byte[]> result) { 
     progressDialog.dismiss(); 
     listView.setAdapter(new ImageAdapter(result)); //Example 
     super.onPostExecute(result); 
    } 

}.execute(imageUrl1, imageUrl2, imageUrl3); 
+0

我使用的是'ImageAdapter'来填充图像到ListView。 'listView).setAdapter(new ImageAdapter());' – rahstame

+0

好的,我补充说。我假设你的ImageAdapter在构造函数中获取图像缓冲区列表。 – rbarriuso

+0

抱歉,我忘记提及我正在使用Universal Image Loader。 – rahstame

相关问题