【问题标题】:Android App Display Image From URLAndroid 应用显示来自 URL 的图像
【发布时间】:2013-02-14 03:22:30
【问题描述】:

我正在寻找一个非常基本的功能。我正在尝试设计一个应用程序,我想要它做的就是从 URL 加载图像。 我发现了一些问题和网站,但它们似乎都较旧且过时,但我认为我遇到的问题是将代码链接到 ImageView 的活动 main.xml。

如果您有任何建议或链接,我将不胜感激,谢谢。

【问题讨论】:

    标签: android url imageview


    【解决方案1】:

    这就是我在图像视图中显示来自 url 的图像的方式
    您必须从主线程以外的线程调用此代码

    ImageView img = (ImageView) findViewById(R.id.imageView1);
    try {
            URL url = new URL("Your URL");
            //try this url = "http://0.tqn.com/d/webclipart/1/0/5/l/4/floral-icon-5.jpg"
            HttpGet httpRequest = null;
    
            httpRequest = new HttpGet(url.toURI());
    
            HttpClient httpclient = new DefaultHttpClient();
            HttpResponse response = (HttpResponse) httpclient
                    .execute(httpRequest);
    
            HttpEntity entity = response.getEntity();
            BufferedHttpEntity b_entity = new BufferedHttpEntity(entity);
            InputStream input = b_entity.getContent();
    
            Bitmap bitmap = BitmapFactory.decodeStream(input);
    
            img.setImageBitmap(bitmap);
    
        } catch (Exception ex) {
    
        }
    

    注意不要忘记用try catch包围代码(我已经在这段代码中这样做了)

    或者您可以使用 webview 从 url 加载图像

    WebView web = (WebView) findViewById(R.id.webView1);
    web.loadUrl("Your Url");
    

    如果您尝试从资产文件夹 url 加载图像,则会像这样开始 “文件:///android_asset/yourimage.jpg”
    否则像这样的普通互联网网址 "http://0.tqn.com/d/webclipart/1/0/5/l/4/floral-icon-5.jpg"

    希望这对你有用 祝你好运

    【讨论】:

    • 我尝试编辑您的帖子,但我认为答案尚未更新。您能否在答案中用粗体字添加注释,提到您必须从主线程以外的线程调用此代码。
    • 但是我没有从线程中调用它,它对我来说很好。你能澄清一下吗。谢谢。
    • android 现在对任何网络通信都有严格的政策。您应该再次尝试此代码。您编写的代码可能需要任何时间才能从远程 url 获取图像,具体取决于网络速度和图像大小。如果您从 UI 调用此代码,那么您的 UI 线程可能会被阻塞并给您 ANR。如果可以,请在 ICS 上尝试此代码。它可能应该给出一个例外“NetWorkOnMainThread”。或者你可以简单地用谷歌搜索这个例外。
    • 我上面写了两个答案,希望第一个答案需要线程。我已经更新了谢谢。
    • 没问题,是的,第一个答案需要线程。在 Webview 中,它已经为您处理好了。
    【解决方案2】:

    有一个名为 imageloader 的开源库。应用广泛,可以直接使用,也可以编写类似的代码。

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

    【讨论】:

      【解决方案3】:

      您可以获取图像并在 php 端将其转换为 base64,然后在 Android 端将其解码为图像。

      【讨论】:

        【解决方案4】:

        下载图片的最佳实践是在后台线程上完成,这样它就不会中断你的主线程,然后根据需要更新用户界面。

        公共类 MainActivity 扩展 AppCompatActivity {

        FrameLayout frameLayout;
        ImageView imageView;
        ProgressBar progressBar;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
        
            frameLayout= (FrameLayout) findViewById(R.id.containerlayout);
            imageView= (ImageView) findViewById(R.id.imageView);
            progressBar= (ProgressBar) findViewById(R.id.progressBar);
        
            String url="http://www.flat-e.com/flate5/wp-content/uploads/cover-960x857.jpg";
            MyTask myTask= new MyTask();
            myTask.execute(url);
        }
        class MyTask extends AsyncTask<String, Void, Bitmap> {
        
            @Override
            protected void onPreExecute() {
                progressBar.setVisibility(View.VISIBLE);
            }
        
            @Override
            protected Bitmap doInBackground(String... voids) {
        
                Bitmap bitmap=null;
                try {
                    URL url =new URL(voids[0]);
                    HttpURLConnection connection= (HttpURLConnection) url.openConnection();
                    InputStream inputStream= connection.getInputStream();
                    bitmap = BitmapFactory.decodeStream(inputStream);
                } catch (IOException e) {
                    e.printStackTrace();
                }
                return bitmap;
            }
        
            @Override
            protected void onPostExecute(Bitmap bitmap) {
                progressBar.setVisibility(View.GONE);
                imageView.setImageBitmap(bitmap);
        
            }
        }
        

        }

        在这里,在此示例中,我创建了一个内部类 MyTask,它扩展了我完成所有网络操作的 AsyncTask。确保在您的清单文件中添加使用权限。

        希望这对你也有用。

        【讨论】:

          猜你喜欢
          • 2011-09-23
          • 1970-01-01
          • 1970-01-01
          • 2014-06-04
          • 1970-01-01
          • 1970-01-01
          • 2011-09-18
          • 2017-03-27
          相关资源
          最近更新 更多