0

我正在实现一个 DrawerLayout 并且抽屉的项目或菜单之一显示一个带有图像的网格视图,这也是一个片段。

问题是当我单击该项目时,在显示图像网格之前会有这种延迟或滞后。

一直在寻找这个,我想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());`

我正在使用 Universal-Image-Loader 来处理图像的下载和显示。 imageLoader.displayImage

4

1 回答 1

0

您可以启动一个新AsyncTask的,在其方法中下载图像doInBackground(在后台线程上运行)并ProgressDialog在其onPostExecute方法中关闭图像(在 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);
于 2013-08-31T02:55:27.763 回答