【问题标题】:How to use asynctask to load images thumbnail in android如何使用 asynctask 在 android 中加载图像缩略图
【发布时间】:2014-02-11 07:13:17
【问题描述】:

我正在尝试将超过 10 个视频的缩略图从服务器获取到 Android 中的图像视图。现在我能够成功地将视频的缩略图显示到图像视图中,但我的问题是显示所有缩略图需要太多时间。所以它显示空白黑屏,直到它加载所有缩略图。

所以我决定使用显示进度条的 Asynctask,直到它加载所有缩略图,但它根本不显示进度条。所以知道如何解决这个问题。

代码

ImageView video_one, video_two, video_three, video_four, video_five;
ImageView video_six, video_seven, video_eight, video_nine, video_ten;
ImageView video_ele, video_twe, video_thir, video_fort, video_fif;

    String path  = "http://serverlink/Fidol/upload/test.mp4";
    String path1 = "http://serverlink/Fidol/upload/ABCD.mp4";
    String path2 = "http://serverlink/Fidol/upload/bean.mp4";
    String path3 = "http://serverlink/Fidol/upload/masti.mp4";
    String path4 = "http://serverlink/Fidol/upload/ben.mp4";

        Bitmap bm = ThumbnailUtils.createVideoThumbnail(path,
            MediaStore.Images.Thumbnails.MICRO_KIND);
    Bitmap bm1 = ThumbnailUtils.createVideoThumbnail(path1,
            MediaStore.Images.Thumbnails.MICRO_KIND);
    Bitmap bm2 = ThumbnailUtils.createVideoThumbnail(path2,
            MediaStore.Images.Thumbnails.MICRO_KIND);
    Bitmap bm3 = ThumbnailUtils.createVideoThumbnail(path3,
            MediaStore.Images.Thumbnails.MICRO_KIND);
    Bitmap bm4 = ThumbnailUtils.createVideoThumbnail(path4,
            MediaStore.Images.Thumbnails.MICRO_KIND);

然后我打了电话

new loadThumbnail().execute();

这是我的异步任务类

class loadThumbnail extends AsyncTask<String, String, String> {

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            pDialog = new ProgressDialog(ShowVideo.this);
            pDialog.setMessage("Loading Videos... Please wait...");
            pDialog.setIndeterminate(false);
            pDialog.setCancelable(true);
            pDialog.show();
        }

        protected String doInBackground(String... args) {

            video_one.setImageBitmap(bm);
            video_two.setImageBitmap(bm1);
            video_three.setImageBitmap(bm2);
            video_four.setImageBitmap(bm3);
            video_five.setImageBitmap(bm4);

            video_six.setImageBitmap(bm);
            video_seven.setImageBitmap(bm1);
            video_eight.setImageBitmap(bm2);
            video_nine.setImageBitmap(bm3);
            video_ten.setImageBitmap(bm4);

            video_ele.setImageBitmap(bm);
            video_twe.setImageBitmap(bm1);
            video_thir.setImageBitmap(bm2);
            video_fort.setImageBitmap(bm3);
            video_fif.setImageBitmap(bm4);

            return null;
        }

        protected void onPostExecute(String file_url) {
            pDialog.dismiss();
        }
    }

【问题讨论】:

  • @Raghunandan,谢谢,但在这种情况下,我没有列表视图以及任何自定义类,我该如何使用您的答案,请帮忙。我只有几个图像视图,我想在其中显示视频缩略图,直到它加载它应该显示进度条。就是这样。
  • 您无法从背景线程更新 ui,您在 doinbackground 中设置位图,这是不可能的。我认为最好使用列表视图。在链接中,您可以从服务器获取图像,您可以从 mediastore 获取图像
  • @Raghunandan,我可以用 gridview 代替 listview 吗???
  • 是的,您可以使用类似于 listview 的 gridview

标签: android image android-asynctask imageview bitmapimage


【解决方案1】:

这样做:

            video_one.setImageBitmap(bm);
            video_two.setImageBitmap(bm1);
            video_three.setImageBitmap(bm2);
            video_four.setImageBitmap(bm3);
            video_five.setImageBitmap(bm4);

            video_six.setImageBitmap(bm);
            video_seven.setImageBitmap(bm1);
            video_eight.setImageBitmap(bm2);
            video_nine.setImageBitmap(bm3);
            video_ten.setImageBitmap(bm4);

            video_ele.setImageBitmap(bm);
            video_twe.setImageBitmap(bm1);
            video_thir.setImageBitmap(bm2);
            video_fort.setImageBitmap(bm3);
            video_fif.setImageBitmap(bm4);

在 onPostExecute 因为你不能从 doinbackground 修改 ui

并在 doInbackground 中执行此操作

        Bitmap bm = ThumbnailUtils.createVideoThumbnail(path,
        MediaStore.Images.Thumbnails.MICRO_KIND);
        Bitmap bm1 = ThumbnailUtils.createVideoThumbnail(path1,
        MediaStore.Images.Thumbnails.MICRO_KIND);
        Bitmap bm2 = ThumbnailUtils.createVideoThumbnail(path2,
        MediaStore.Images.Thumbnails.MICRO_KIND);
        Bitmap bm3 = ThumbnailUtils.createVideoThumbnail(path3,
        MediaStore.Images.Thumbnails.MICRO_KIND);
        Bitmap bm4 = ThumbnailUtils.createVideoThumbnail(path4,
        MediaStore.Images.Thumbnails.MICRO_KIND);

【讨论】:

    【解决方案2】:

    我觉得你应该放

    Bitmap bm = ThumbnailUtils.createVideoThumbnail(path,
            MediaStore.Images.Thumbnails.MICRO_KIND);
    Bitmap bm1 = ThumbnailUtils.createVideoThumbnail(path1,
            MediaStore.Images.Thumbnails.MICRO_KIND);
    Bitmap bm2 = ThumbnailUtils.createVideoThumbnail(path2,
            MediaStore.Images.Thumbnails.MICRO_KIND);
    Bitmap bm3 = ThumbnailUtils.createVideoThumbnail(path3,
            MediaStore.Images.Thumbnails.MICRO_KIND);
    Bitmap bm4 = ThumbnailUtils.createVideoThumbnail(path4,
            MediaStore.Images.Thumbnails.MICRO_KIND);
    

    doInBackground 方法下,因为据我了解,这就是任务发生的地方。

    【讨论】:

      【解决方案3】:

      在 AsyncTask 中有一个方法 callonProgressUpdate(Integer...) 可以用来更新进度。 Check this link

      【讨论】:

        【解决方案4】:

        试试这个

        @Override
            protected void onPreExecute() {
                pDialog = new ProgressDialog(ShowVideo.this);
                pDialog.setMessage("Loading Videos... Please wait...");
                pDialog.show();
            }
        

        如果你在某处写了loadThumbnail.get(),也可以在你的代码中删除它,因为这会阻塞 UI 线程。

        【讨论】:

          【解决方案5】:

          这可能会有所帮助:

          class SetThumb extends AsyncTask<String, Void, Bitmap>{
          private ImageView imageView;
          SetThumb(ImageView imageView){
              this.imageView=imageView;
          }
          
          @Override
          protected Bitmap doInBackground(String... strings) {
              return ThumbnailUtils.createVideoThumbnail(strings[0],MediaStore.Video.Thumbnails.MICRO_KIND);
          }
          
          @Override
          protected void onPostExecute(Bitmap thumb){
              imageView.setImageBitmap(thumb);
          }
          

          }

          现在执行此任务

          new SetThumb(your_image_view).execute(path_of_file);
          

          【讨论】:

            猜你喜欢
            • 2013-04-03
            • 2012-03-28
            • 2013-12-24
            • 2013-12-09
            • 1970-01-01
            • 1970-01-01
            • 2013-12-21
            • 2011-03-06
            • 2013-04-29
            相关资源
            最近更新 更多