从 url 获取位图的挑战

A challenge to get the Bitmap from from url

我知道这个问题有很多答案,但它是一个挑战,我只希望有兴趣的人试一试。

http://api.pt-helper.com/ptimages/web/uploads/Median%20Nerve%20Glide%20–%20D%202_300.png

上面是需要抓取并显示在ImageView中的图片url。问题是图像没有从 URL 正确加载。

我想 post wt 很有挑战性,因为 zgc7009 已经设法找到正确答案并理解我的问题。

感谢大家抽出宝贵的时间来解决这个问题。

使用 Volley's ImageRequest 从 URL

获取图像
    public static final String URL = "http://api.pt-helper.com/ptimages/web/uploads/Median%20Nerve%20Glide%20–%20D%202_300.png";

    ImageRequest imageRequest = new ImageRequest(URL, new Response.Listener<Bitmap>() {
        @Override
        public void onResponse(final Bitmap response) {

                    your_imageView.setImageBitmap(response);
        }
    }, 0, 0, ImageView.ScaleType.CENTER_INSIDE, null, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            Toast.makeText(your_activity_name.this, error.toString(), Toast.LENGTH_LONG).show();
        }
    });

    RequestQueue requestQueue = Volley.newRequestQueue(RescuingActivity.this);
    requestQueue.add(imageRequest);

如果它的图片很重,请使用 AsyncTask

background thread 中加载它

注意:确保您在清单文件中添加了互联网权限。

public class LoadImageWebActivity extends Activity {
    /** Called when the activity is first created. */

    ImageView imgLogo;
    ProgressBar progressbar;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        imgLogo = (ImageView) findViewById(R.id.imageView1);
        progressbar = (ProgressBar) findViewById(R.id.loadingBar);

    } 

    public void btnLoadImageClick(View view)
    {
        //imgLogo.setBackgroundDrawable(LoadImageFromWeb("http://www.android.com/media/wallpaper/gif/android_logo.gif"));
        new loadImageTask().execute("http://api.pt-helper.com/ptimages/web/uploads/Median%20Nerve%20Glide%20–%20D%202_300.png");
    }

    public class loadImageTask extends AsyncTask<String, Void, Void>
    {
        Drawable imgLoad;

        @Override
        protected void onPreExecute() {
            // TODO Auto-generated method stub
            super.onPreExecute();

            progressbar.setVisibility(View.VISIBLE);
        }

        @Override
        protected Void doInBackground(String... params) {
            // TODO Auto-generated method stub

            imgLoad = LoadImageFromWeb(params[0]);
            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            // TODO Auto-generated method stub
            super.onPostExecute(result);

            if(progressbar.isShown())
            {
                progressbar.setVisibility(View.GONE);
                imgLogo.setVisibility(View.VISIBLE);
                imgLogo.setBackgroundDrawable(imgLoad);
            }
        }
    }

    public static Drawable LoadImageFromWeb(String url) 
    {
        try 
        {
            InputStream is = (InputStream) new URL(url).getContent();
            Drawable d = Drawable.createFromStream(is, "src name");
            return d;
        } catch (Exception e) {
            return null;
        }
    }
}

布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <Button 
        android:text="Load Image" 
        android:id="@+id/button1" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:onClick="btnLoadImageClick">
    </Button>

  <RelativeLayout
    android:id="@+id/sublayout"
    android:layout_height="match_parent"
    android:layout_width="match_parent"
    android:layout_below="@+id/button1">

      <ProgressBar
        android:id="@+id/loadingBar"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:visibility="gone">
    </ProgressBar>

    <ImageView 
        android:id="@+id/imageView1" 
        android:layout_height="200dp" 
        android:layout_width="200dp"
        android:scaleType="center"
        android:layout_centerInParent="true">
    </ImageView>
  </RelativeLayout>

</RelativeLayout>

我正在使用 glide 库从 URL 获取图像。我刚刚使用了下面的代码

 Glide.with(activityRef)
                        .load("http://api.pt-helper.com/ptimages/web/uploads/Median%20Nerve%20Glide%20–%20D%202_300.png")
                        .diskCacheStrategy(DiskCacheStrategy.NONE)
                        .skipMemoryCache(true)                   
                        .crossFade()
                        .override(1700, 1700)
                        .diskCacheStrategy(DiskCacheStrategy.ALL)
                        .into(viewHolder.feedImage);

            }

不到一秒钟我就得到了图像!

我收回 一些 评论的严厉 :P 你提供的 url 确实在浏览器中显示了图像,但我无法将其显示到使用提供的 url 使用 Picasso 库加载图像。但是,在检查元素并在图像本身中使用来自图像源的 url 之后,恰好是

http://api.pt-helper.com/ptimages/web/uploads/Median%20Nerve%20Glide%20%E2%80%93%20D%202_300.png

我可以用 Picasso 提取图像。