在显示片段之前执行AsyncTask

时间:2013-08-31 02:24:02

标签: java android android-fragments android-asynctask fragment

我正在实施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

1 个答案:

答案 0 :(得分: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);