【问题标题】:How to add Loading dialog While fetching image from server in Android?如何在Android中从服务器获取图像时添加加载对话框?
【发布时间】:2013-01-03 07:11:28
【问题描述】:

我正在尝试在以下代码中添加加载对话框以从服务器获取图像并将其显示在图库视图中。它显示空白屏幕,直到图像出现。请帮助我如何在从服务器获取图像时显示加载对话框。

这是代码,请帮助。

    public class ImagedisplaytestActivity extends Activity {
        private ImageView leftArrowImageView;
        private ImageView rightArrowImageView;
        private Gallery gallery;
        public int selectedImagePosition;
        private GalleryImageAdapter galImageAdapter;
        private String bitmapImg = "";
        Bitmap bitmap = null;
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);

            setupUI();
        }

        private void setupUI() {
            Intent i = getIntent();
            Bundle extras=i.getExtras();
            bitmapImg = extras.getString("BitmapImage");
            selectedImagePosition = extras.getInt("Pos");

            leftArrowImageView = (ImageView) findViewById(R.id.left_arrow_imageview);
            rightArrowImageView = (ImageView) findViewById(R.id.right_arrow_imageview);
            gallery = (Gallery) findViewById(R.id.gallery);
            leftArrowImageView.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (selectedImagePosition > 0) {
                        --selectedImagePosition;
                    }
                    gallery.setSelection(selectedImagePosition, false);
                }
            });

            rightArrowImageView.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (selectedImagePosition < DetailView.bitmapURL.size() - 1) {
                        ++selectedImagePosition;
                    }
                    gallery.setSelection(selectedImagePosition, false);
                }
            });

            gallery.setOnItemSelectedListener(new OnItemSelectedListener() {
                @Override
                public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
                    selectedImagePosition = pos;
                    if (selectedImagePosition > 0 && selectedImagePosition < DetailView.bitmapURL.size() - 1) {
                        leftArrowImageView.setImageDrawable(getResources().getDrawable(R.drawable.arrow_left_disabled));
                        rightArrowImageView.setImageDrawable(getResources().getDrawable(R.drawable.arrow_right_disabled));
                    } else if (selectedImagePosition == 0) {
                        leftArrowImageView.setImageDrawable(getResources().getDrawable(R.drawable.arrow_left_enabled));
                    } else if (selectedImagePosition == DetailView.bitmapURL.size() - 1) {
rightArrowImageView.setImageDrawable(getResources().getDrawable(R.drawable.arrow_right_enabled));
                    }
                }

                @Override
                public void onNothingSelected(AdapterView<?> arg0) {
                }
            });

            galImageAdapter = new GalleryImageAdapter(this, DetailView.bitmapURL);
            gallery.setAdapter(galImageAdapter);
            if (DetailView.bitmapURL.size() > 0) {
                gallery.setSelection(selectedImagePosition, false);
            }
            if (DetailView.bitmapURL.size() == 1) {
                rightArrowImageView.setImageDrawable(getResources().getDrawable(R.drawable.arrow_right_disabled));
            }

        }

        public class GalleryImageAdapter extends BaseAdapter {
            private Activity context;
            private  ImageView imageView;
            private List<String>  plotsImages;
            private ViewHolder holder;
            public GalleryImageAdapter(Activity context, List<String> plotsImages) {
                this.context = context;
                this.plotsImages = plotsImages;
            }

            @Override
            public int getCount() {
                return plotsImages.size();
            }

            @Override
            public Object getItem(int position) {
                return null;
            }

            @Override
            public long getItemId(int position) {
                return 0;
            }

            @Override
            public View getView(int position, View convertView, ViewGroup parent) {
                if (convertView == null) {
                    holder = new ViewHolder();
                    imageView = new ImageView(this.context);
                    imageView.setPadding(3, 3, 3, 3);
                    convertView = imageView;
                    holder.imageView = imageView;
                    convertView.setTag(holder);
                } else {
                    holder = (ViewHolder) convertView.getTag();
                }
                holder.imageView.setLayoutParams(new Gallery.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
                holder.imageView.setScaleType(ImageView.ScaleType.FIT_XY);

                try {
                    bitmap = DownloadImage(plotsImages.get(position));
                    holder.imageView.setImageBitmap(bitmap);
                    bitmap = null;
                } catch (Exception e) {
                    e.printStackTrace();
                }
                return imageView;
            }

            private class ViewHolder {
                ImageView imageView;
            }


             private Bitmap DownloadImage(String URL){
                    Bitmap bitmap = null;
                    try {
                        InputStream in = OpenHttpConnection(URL);
                        bitmap = BitmapFactory.decodeStream(in);
                        in.close();
                    } catch (IOException e1) {
                        e1.printStackTrace();
                    }
                    return bitmap;
                }

                private InputStream OpenHttpConnection(String urlString) throws IOException{
                    InputStream in = null;
                    int response = -1;
                    URL url = new URL(urlString);
                    URLConnection conn = url.openConnection();

                    if (!(conn instanceof HttpURLConnection)) {
     throw new IOException("Not an HTTP connection");
                    }
                    try{
                        HttpURLConnection httpConn = (HttpURLConnection) conn;
                        httpConn.setAllowUserInteraction(false);
                        httpConn.setInstanceFollowRedirects(true);
                        httpConn.setRequestMethod("GET");
                        httpConn.connect();
                        response = httpConn.getResponseCode();
                        if (response == HttpURLConnection.HTTP_OK) {
                            in = httpConn.getInputStream();
                        }
                    }
                    catch (Exception ex){
     throw new IOException("Error connecting");
                    }
                    return in;
                }
    }

        @Override
        public void onBackPressed() {
            DetailView.bundleID = DetailView.idList.get(selectedImagePosition);
                    super.onBackPressed();
        }
    }

【问题讨论】:

  • Ronak 已经有很多关于 如何在 ListView 中延迟加载图像以及 从服务器加载图像时显示进度条的 QA,搜索并使用它。
  • Paresh,我已经尝试了很多搜索并实现它,但没有成功。这就是为什么我将它发布在 Stack 中。我需要指导。请帮忙。谢谢。
  • 我确定您的问题是在从网络加载图像时显示进度条,这意味着从网络加载 10 个图像时必须有 10 个进度。

标签: android dialog loading progressdialog image-loading


【解决方案1】:

你应该使用AsyncTask! 见this also! & in Vogella Example 将清除您的疑问。 看到这个惰性图像加载DEMO!在github上。

【讨论】:

    【解决方案2】:

    使用异步任务, 在那个 assynctask 方法中,您可以在doinbackground() 中编写从服务器获取图像, 在那个时候,您可以使用preexectue() 显示警报对话框,从服务器加载后只需关闭postexectue() 中的警报对话框。

    【讨论】:

    • 请正确阅读他的问题,是的,您的回答可能会有所帮助,但他想在列表视图中加载图像时放置进度条。
    【解决方案3】:

    此代码对我有用

    private class LoadGlobalDataSearch extends AsyncTask<String, Void, Void>
        {
    
            @Override
            protected void onPostExecute(Void result)
            {
                super.onPostExecute(result);
    
                progressdialog.dismiss();
    
    
            }
    
    
            @Override
            protected Void doInBackground(String... params)
            {
    
                //Load your images this task
                            setupUI();
                return null;
            }
    
            @Override
            protected void onPreExecute() 
            {
                super.onPreExecute();
                progressdialog = ProgressDialog.show(MainActivity.this, "",getString(R.string.inprogress));
            }
        }
    

    在你的 oncreate 方法中调用这个类

    new loadImages().execute(0);
    

    【讨论】:

    • 请正确阅读他的问题,是的,您的回答可能会有所帮助,但他想在列表视图中加载图像时放置进度条。
    • @PareshMayani:-你可以在AsynTask中使用onprogessUpdate方法并调用doinbackground publishprogress();
    • Jeetu & V.P,我已经实现了你的代码,但是 LoadGlobalDataSearch loadImg = new LoadGlobalDataSearch(); loadImg.execute(参数);但是我应该通过哪些参数??
    • @RonakPandya:loadImg.execute();
    • @V.P 我已经尝试过您的代码,它在加载完整图像后显示强制关闭。图像显示直到加载,加载完成后显示 forceclose。请帮忙。我想在获取图像时显示加载。感谢兄弟的帮助。
    【解决方案4】:

    您可以使用进度对话框,直到图像下载完成,然后删除对话框。

    在 OpenHttpConnection 中添加这个 --

    dialog = ProgressDialog.show(DutyRotaActivity.this, "",
                    "Please wait for few seconds...", true);
    

    在 DownloadImage 中关闭对话框。

    dialog.dismiss();
    

    或者你也可以使用异步任务。导致网络操作应始终在其他线程上进行 不在主线程中。在这种情况下,preExecute 添加对话框,postExecute 关闭对话框。在doinbackground 中调用你的downloadimage 函数,它也可以解决问题。

    编辑

    这是一个完整的源代码和一个库,用于在listView 中延迟加载图像。我认为它也可以帮助您解决问题。谢谢

    https://github.com/nostra13/Android-Universal-Image-Loader

    【讨论】:

    • 请正确阅读他的问题,是的,您的回答可能会有所帮助,但他想在列表视图中加载图像时放置进度条。
    • 感谢 Mayani,您好 Pankaj,您可以使用此库在 listview github.com/nostra13/Android-Universal-Image-Loader 中懒惰地加载您的图像
    • @ChinmoyDebnath 是的,他可以使用这个库或任何库,但他的问题正是要在加载图像时显示进度条。所以加载100张图片一定要有100个进度条。
    • @ChinmoyDebnath 我没有问这个问题。是的,您有些困惑,您应该阅读并重新阅读该问题。
    • @ChinmoyDebnath 我试过你的代码,但它只显示空白屏幕。在 OpenHttpConnection 中实现并在 DownloadImage 中关闭。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-18
    • 2017-11-18
    • 2017-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多