有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java使用URL加载图像

我正在尝试使用我的应用程序中的URL和按钮下载图像。当我在手机上运行它时,我无法下载图像。有人能指出这个问题吗。提前感谢您的帮助:)

这是我的密码

public class MainActivity extends AppCompatActivity {

ImageView download;

public void downloadImage(View view){

    DownloadImage image = new DownloadImage();
    Bitmap result;
    try {
        result = image.execute("https://en.wikipedia.org/wiki/File:Bart_Simpson_200px.png").get();
        download.setImageBitmap(result);
    }
    catch(Exception e)
    {
        e.printStackTrace();
    }
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    download = (ImageView) findViewById(R.id.imageView);
}

public class DownloadImage extends AsyncTask<String, Void, Bitmap>{

    @Override
    protected Bitmap doInBackground(String... urls) {
        URL url;
        HttpURLConnection urlConnection = null;
        try {
            url = new URL(urls[0]);
            urlConnection = (HttpURLConnection) url.openConnection();
            urlConnection.setDoInput(true);
            urlConnection.connect();
            InputStream in = urlConnection.getInputStream();
            Bitmap Image = BitmapFactory.decodeStream(in);
            in.close();
            return Image;
        }
        catch (MalformedURLException e) {
            e.printStackTrace();
        }
        catch (IOException e) {
            e.printStackTrace();
        }
         return null;
    }
}
}

共 (2) 个答案

  1. # 1 楼答案

    您可以通过两种方式从url下载图像

    1。您可以使用Glide library从url加载图像。请查看下面的代码。它可以以简单的方式帮助您

    编译此库

       implementation 'com.github.bumptech.glide:glide:4.6.1'
    

    而不是像这样加载图像

     Glide.with(MainActivity.this)
            .load(url)
            .apply(new RequestOptions().placeholder(R.drawable.booked_circle).error(R.drawable.booked_circle))
            .into(imageview);
    

    2。如果不想使用第三方库,请尝试此选项

     new DownloadImage(imamgeview).execute(url);
    

    创建异步任务

    public class DownloadImage extends AsyncTask<String, Void, Bitmap> {
    ImageView bmImage;
    
    public DownloadImage(ImageView bmImage) {
        this.bmImage = (ImageView ) bmImage;
    }
    
    protected Bitmap doInBackground(String... urls) {
        String urldisplay = urls[0];
        Bitmap mIcon11 = null;
        try {
            InputStream in = new java.net.URL(urldisplay).openStream();
            mIcon11 = BitmapFactory.decodeStream(in);
        } catch (Exception e) {
            Log.d("Error", e.getStackTrace().toString());
    
        }
        return mIcon11;
    }
    
    protected void onPostExecute(Bitmap result) {
        bmImage.setImageBitmap(result);
    }
    }
    

    我希望它对你的情况有效

  2. # 2 楼答案

    您没有调用该函数

    downloadImage(view);
    

    在oncreate中(findviewbyid行之后)

    还要检查Android清单文件中是否有internet权限:

        <uses-permission android:name="android.permission.INTERNET" />
    

    我说过你应该使用像Glide\Picasso\Ion这样的图书馆。。。对于此用途,比asynctask好得多

    https://github.com/bumptech/glide-滑翔

    https://github.com/koush/ion-离子

    毕加索

    希望有帮助