安卓进度条不按预期工作

3

我是一个新手,对Android和Java不太熟悉。我一直在做我的任务,即图片下载器。我需要用进度条下载图像并将它们显示在网格中。我创建了两个类: 1. URLImageAdapter 2. CacheActivity。 一切都很好,但是下载会在我点击按钮之前开始,并且当我点击下载按钮时,进度条出现并且到100后消失,但下载仍在进行中。我希望同步下载图像和进度条。

以下是代码。请帮忙。

    public class URLImageAdapter extends BaseAdapter {

private class Image {
    String url;
    Bitmap thumb;
}

private Image[] images;
private Context myContext;
private LoadThumbsTask thumbnailGen;
private Object previousList;

public URLImageAdapter(Context c) {
    myContext = c;
    thumbnailGen = new LoadThumbsTask();

    if (previousList != null) {
        images = (Image[]) previousList;
        thumbnailGen.execute(images);
        return;
    }

    images = new Image[imageURLs.length];

    for (int i = 0, j = imageURLs.length; i < j; i++) {
        images[i] = new Image();
        images[i].url = imageURLs[i];
    }

    thumbnailGen.execute(images);

}

public int getCount() {
    return images.length;
}

public Object getItem(int position) {
    return images[position].url;
}

public long getItemId(int position) {
    return position;
}

public Object getData() {
    if (thumbnailGen != null
            && thumbnailGen.getStatus() != AsyncTask.Status.FINISHED) {
        thumbnailGen.cancel(true);
    }

    return images;
}

public View getView(int position, View convertView, ViewGroup parent) {

    ImageView imgView;

    Image cached = images[position];

    if (convertView == null) {

        imgView = new ImageView(myContext);
        imgView.setLayoutParams(new GridView.LayoutParams(100, 100));

    } else {

        imgView = (ImageView) convertView;

    }

    if (cached.thumb == null) {

        imgView.setImageResource(R.drawable.ic_action_search);
        imgView.setScaleType(ScaleType.CENTER);

    } else {

        imgView.setScaleType(ScaleType.FIT_CENTER);
        imgView.setImageBitmap(cached.thumb);

    }

    return imgView;
}

private void cacheUpdated() {
    this.notifyDataSetChanged();
}


private Bitmap loadThumb(String url) {

    Bitmap thumb = null;

    BitmapFactory.Options opts = new BitmapFactory.Options();
    opts.inSampleSize = 4;

    try {

        URL u = new URL(url);
        URLConnection c = u.openConnection();
        c.connect();

        BufferedInputStream stream = new BufferedInputStream(
                c.getInputStream());

        thumb = BitmapFactory.decodeStream(stream, null, opts);


        stream.close();

    } catch (MalformedURLException e) {
        Log.e("ERROR", "malformed url: " + url);
    } catch (IOException e) {
        Log.e("ERROR", "An error has occurred downloading the image: "
                + url);
    }

    return thumb;
}

private class LoadThumbsTask extends AsyncTask<Image, Void, Void> {

    @Override
    protected Void doInBackground(Image... cache) {

        BitmapFactory.Options opts = new BitmapFactory.Options();
        opts.inSampleSize = 4;

        for (Image i : cache) {

            if (isCancelled())
                return null;

            if (i.thumb != null)
                continue;

            SystemClock.sleep(500);

            i.thumb = loadThumb(i.url);

            publishProgress();
        }

        return null;

    }

    @Override
    protected void onProgressUpdate(Void... param) {
        cacheUpdated();
    }
}

private String[] imageURLs = {
        "http://cdn.cs76.net/2011/spring/lectures/6/imgs/img_2851.jpg",
        "http://cdn.cs76.net/2011/spring/lectures/6/imgs/img_2944.jpg",
        "http://cdn.cs76.net/2011/spring/lectures/6/imgs/img_2989.jpg",
        "http://cdn.cs76.net/2011/spring/lectures/6/imgs/img_3005.jpg",
        "http://cdn.cs76.net/2011/spring/lectures/6/imgs/img_3012.jpg",
        "http://cdn.cs76.net/2011/spring/lectures/6/imgs/img_3034.jpg",
        "http://cdn.cs76.net/2011/spring/lectures/6/imgs/img_3047.jpg",
        "http://cdn.cs76.net/2011/spring/lectures/6/imgs/img_3092.jpg",
        "http://cdn.cs76.net/2011/spring/lectures/6/imgs/img_3110.jpg",
        "http://cdn.cs76.net/2011/spring/lectures/6/imgs/img_3113.jpg",
        "http://cdn.cs76.net/2011/spring/lectures/6/imgs/img_3128.jpg",
        "http://cdn.cs76.net/2011/spring/lectures/6/imgs/img_3160.jpg",
        "http://cdn.cs76.net/2011/spring/lectures/6/imgs/img_3226.jpg",
        "http://cdn.cs76.net/2011/spring/lectures/6/imgs/img_3228.jpg",
        "http://cdn.cs76.net/2011/spring/lectures/6/imgs/img_3251.jpg",
        "http://cdn.cs76.net/2011/spring/lectures/6/imgs/img_3268.jpg",
        "http://cdn.cs76.net/2011/spring/lectures/6/imgs/img_3275.jpg",
        "http://cdn.cs76.net/2011/spring/lectures/6/imgs/img_3346.jpg",
        "http://cdn.cs76.net/2011/spring/lectures/6/imgs/img_3365.jpg",
        "http://cdn.cs76.net/2011/spring/lectures/6/imgs/img_3374.jpg",
        "http://cdn.cs76.net/2011/spring/lectures/6/imgs/img_3385.jpg",
        "http://cdn.cs76.net/2011/spring/lectures/6/imgs/img_3392.jpg", };
  }

缓存活动

public class CacheActivity extends Activity {

Button btnStartProgress;
ProgressDialog progressBar;
private int progressBarStatus = 0;
private Handler progressBarHandler = new Handler();

private long fileSize = 0;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_cache);
    GridView gridview = (GridView) findViewById(R.id.grid_view);
    gridview.setAdapter(new URLImageAdapter(this));
    addListenerOnButton();

    }



public void addListenerOnButton() {

    btnStartProgress = (Button) findViewById(R.id.btnStartProgress);
    btnStartProgress.setOnClickListener(new OnClickListener() {

        public void onClick(View v) {

            progressBar = new ProgressDialog(v.getContext());
            progressBar.setCancelable(true);
            progressBar.setMessage("File downloading ...");
            progressBar.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
            progressBar.setProgress(0);
            progressBar.setMax(100);
            progressBar.show();

            progressBarStatus = 0;

            fileSize = 0;

            new Thread(new Runnable() {
                public void run() {
                    while (progressBarStatus < 100) {

                        progressBarStatus = doInBackground();

                        try {
                            Thread.sleep(1000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }

                        progressBarHandler.post(new Runnable() {
                            public void run() {
                                progressBar.setProgress(progressBarStatus);
                            }
                        });
                    }

                    if (progressBarStatus >= 100) {

                        try {
                            Thread.sleep(200);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }

                        progressBar.dismiss();
                    }
                }
            }).start();

        }

    });

}

public int doInBackground() {

    while (fileSize <= 1000000) {

        fileSize++;

        if (fileSize == 100000) {
            return 10;
        } else if (fileSize == 200000) {
            return 20;
        } else if (fileSize == 300000) {
            return 30;
        }else if (fileSize == 400000) {
            return 40;
        }else if (fileSize == 500000) {
            return 50;
        }else if (fileSize == 600000) {
            return 60;
        }else if (fileSize == 700000) {
            return 70;
        }else if (fileSize == 800000) {
            return 80;
        }else if (fileSize == 900000) {
            return 90;
        }

    }

    return 100;

}

}

2
问题:为什么需要让异步任务睡眠? - Neilers
@Neilers SystemClock.sleep(500); // 人为制造延迟! - Cindy Khanna
4个回答

1

使用中下载图像

public class LoginProgress extends AsyncTask<Object, Object, Object> {
       private ProgressDialog dialog;
          @Override
            protected void onPreExecute() {
            this.dialog = ProgressDialog.show(applicationContext, "Please wait down",
                "Loading .....", true);
                    }
                @Override
                protected Object doInBackground(Object... params) {
                    // TODO Auto-generated method stub
                    return null;
                }
                @Override
                protected void onPostExecute(Void unused) {
        //Intent for next activity
         this.dialog.dismiss();
        }

            }

在按钮点击时创建这些类的对象。
  LoginProgress task = new LoginProgress();
    task.execute();

在这些doinbackground方法中调用您的doinbackground方法

否则执行以下两个操作

将Thread.sleep(1000)的时间增加为Thread.sleep(4000); 将Thread.sleep(200)的时间增加为Thread.sleep(450);

您在oncreate中设置了gridview.setAdapter(new URLImageAdapter(CacheActivity.this)); 将此适配器从oncreate中删除,并将其编写到单击方法末尾...


您将获得带有旋转器和文本的ProgressDialog。 - sai
是的,我知道。我被要求获取一个水平进度条,我已经得到了。我的问题是如何同步下载和进度条。请帮助我,Sai。 如果需要,我可以将整个代码发送给您,您可以检查一下。 - Cindy Khanna
请访问以下链接:http://www.androidhive.info/2012/04/android-downloading-file-by-showing-progress-bar/ - sai
已经按照那个做了...!! 但是我是 Java 和 Android 的新手,不知道如何进行更改,你能帮我做一些更改并帮我吗? - Cindy Khanna
发送至saiyadamreddy@gmail.com,我会尽快处理,否则请等到周一。 - sai

0
public int doInBackground() {

while (fileSize <= 1000000) {

    fileSize++;

    if (fileSize == 100000) {
        return 10;
    } else if (fileSize == 200000) {
        return 20;
    } else if (fileSize == 300000) {
        return 30;
    }else if (fileSize == 400000) {
        return 40;
    }else if (fileSize == 500000) {
        return 50;
    }else if (fileSize == 600000) {
        return 60;
    }else if (fileSize == 700000) {
        return 70;
    }else if (fileSize == 800000) {
        return 80;
    }else if (fileSize == 900000) {
        return 90;
    }

}

return 100;

}

它与实际文件大小无关。应该是类似于这样的东西

return (currentFilesize/totalFilesize)*100 

而不仅仅是像这样的原始值。


0
根据我的经验,当ProgressBar位于ListView或GridView中时,它会出现刷新问题。如果您只想指示进度,我建议开发自己的控件,该控件看起来像RelativeLayout中的ProgressBar。
使用RelativeLayout并在其中添加ImageView。增加ImageView的宽度以说明进度。
如果您希望,我可以发布代码,我已经为自己开发了这样的进度条。
更新:我找到了一个好的帖子,介绍了我描述的相同技术。

http://blog.mediarain.com/2011/04/android-custom-progressbar-with-rounded-corners/

演示可下载:http://blog.mediarain.com/wp-content/uploads/2011/04/RoundedProgressSample.zip


请问您能做到吗?这将非常棒。 - Cindy Khanna
KP,这些链接很有用,但是在我的任务中不允许使用。 - Cindy Khanna

0
问题在于您没有向LoadThumbsTaskpublishProgress()方法传递任何值。 向该方法传递一些值(例如已下载缩略图的数量),然后在onProgressUpdate()中根据此值更新ProgressDialog

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