如何在Android应用程序中的网格视图中加载图片时显示进度条

3
在我的应用程序中,当启动一个活动时,我会访问一个 URL,并从中获取 XML 文件。XML 文件包含各种图像的 URL。我解析这些值并将它们存储在一个数组列表中。从该列表中,我的网格视图会加载图像。但是,在从 Web 服务加载图像时,有时会出现黑屏的情况。因此,在这种情况下,我想显示进度条。
以下是显示进度条的代码:
class Image extends AsyncTask<Void, Void, Void> 
 {       
       ProgressDialog dialog = new ProgressDialog(ProfileImages.this);

    protected void onPreExecute() 
    {       
        dialog.setMessage("Please wait...");
        dialog.setIndeterminate(true);
        dialog.show();
    }

        protected void onPostExecute(Void unused) 
    {
                    i.setImageBitmap(bm);
        dialog.dismiss();
    }

        @Override
    protected Void doInBackground(Void... params) 
    {
            parsing();
                grid.setAdapter(new ImageAdapter(this));
        return null;
    }
}

但我的应用程序崩溃了。解析函数运行良好,但当它到达了该处时。
 grid.setAdapter(new ImageAdapter(this));

public View getView(final int position, View convertView,ViewGroup parent) 
    {
        ImageView i = new ImageView(this.myContext);
        if (convertView == null) 
        {
            i = new ImageView(myContext);
            i.setLayoutParams(new GridView.LayoutParams(105, 105));
            i.setScaleType(ImageView.ScaleType.CENTER_CROP);
            i.setPadding(8, 8, 8, 8);

             i.setOnClickListener(new View.OnClickListener()
             {
                 public void onClick(View view)
                 {

                     dialog = new ProgressDialog(ProfileGridView.this);
                     dialog.setMessage("Please wait...");
                     dialog.setIndeterminate(true);
                     dialog.show();
                     new Thread() 
                     {
                        public void run() 
                        {
                            try 
                            {
                                Thread.sleep(300);
                            }
                            catch (InterruptedException e) 
                            {
                                e.printStackTrace();
                            }
                            Bundle bundle = new Bundle();
                            bundle.putInt("key1",position); 
                            Appconstant.showLog("position clicked "+position);

                            Intent myIntent = new Intent(getBaseContext(),ProfileImages.class);
                            myIntent.putExtras(bundle);
                            startActivityForResult(myIntent, 0);
                            dialog.dismiss();
                        }
                     }.start();
                 }
             });
        } 
        else 
        {
            i = (ImageView) convertView;
        }

        try 
        {
            URL aURL = new URL(myRemoteImages[position]);
            Appconstant.showLog("Grid View URL " + aURL);
            URLConnection conn = aURL.openConnection();
            conn.connect();
            InputStream is = conn.getInputStream();

            BufferedInputStream bis = new BufferedInputStream(is);
            Bitmap bm = BitmapFactory.decodeStream(bis);
            bis.close();
            is.close();

            i.setImageBitmap(bm);
        } 
        catch (IOException e) 
        {
            Appconstant.showErrorLog("DEBUGTAG Remtoe Image Exception" + e);
        }
        return i;
    }

    public float getScale(boolean focused, int offset) 
    {
        return Math.max(0, 1.0f / (float) Math.pow(2, Math.abs(offset)));
    }
}   

它崩溃了。请帮我解决这个问题。


Uncaughthandler:thread AsyncTask#1退出由于未捕获的异常 执行doInBackground()时发生错误 在java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)处 在java.util.concurrent.FutureTask.setException(FutureTask.java:124)处 在java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)处 在java.util.concurrent.FutureTask.run(FutureTask.java:137)处 在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068)处 在java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561)处 在java.lang.Thread.run(Thread.java:1096)处 - Siva K
doInBackground() 方法中的 i 和 bm 是什么?整个方法看起来很奇怪。 - Egor
我已经添加了一些关于i和bm的代码。这里,i指的是图像视图,而bm则是位图。 - Siva K
由于doInBackground方法在单独的线程中运行,因此您无法在其中访问视图。将位图附加到视图应该在onPostExecute中完成。 - Egor
抱歉,我错误地发布了代码... 我已经将解析和网格活动放在doInBackground中,并在onPostExecute中显示图像。现在我已经更改了代码。对于这段代码,我只收到了上述的logcat。 - Siva K
1
grid.setAdapter(new ImageAdapter(this)); 也应该在 onPostExecute 中进行。 - Egor
2个回答

1
class GridImages extends AsyncTask<Void, Void, Void> 
     {       
           ProgressDialog dialog = new ProgressDialog(ProfileGridView.this);

        protected void onPreExecute() 
        {       
            dialog.setMessage("Please wait...");
            dialog.setIndeterminate(true);
            dialog.show();
        }

        protected void onPostExecute(Void unused) 
        {
            grid.setAdapter(new ImageAdapter(ProfileGridView.this));
            dialog.dismiss();
        }

            @Override
        protected Void doInBackground(Void... params) 
        {
                parsing();      
            return null;
        }
    }

0
你需要一种从AsyncTask内部访问活动的方法 - 不能简单地编写 "ProfileGridView.this",因为它不是一个封闭任务。你应该重写asynctask的构造函数,并将调用活动的上下文与它一起传递进去。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接