gpt4 book ai didi

android - 在 Android 上为 imageview 下载图像

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:10:21 28 4
gpt4 key购买 nike

我看过这个问题:android how to download an 1mb image file and set to ImageView
它没有解决我的问题,因为它只显示了如何显示位图之后您已经有了位图。

我正在尝试从 URL 下载图像,以便在 Android 设备上使用 ImageView 显示它。我不确定该怎么做。

我在网上查了一下,这是我目前的代码:

public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//Set local image
ImageView image = (ImageView) findViewById(R.id.test_image);
image.setImageResource(R.drawable.test2);

//Prepare to download image
URL url;
InputStream in;

//BufferedInputStream buf;
try {
url = new URL("http://i.imgur.com/CQzlM.jpg");
in = url.openStream();

out = new BufferedOutputStream(new FileOutputStream("testImage.jpg"));
int i;

while ((i = in.read()) != -1) {
out.write(i);
}
out.close();
in.close();

buf = new BufferedInputStream(in);
Bitmap bMap = BitmapFactory.decodeStream(buf);
image.setImageBitmap(bMap);
if (in != null) {
in.close();
}
if (buf != null) {
buf.close();
}
} catch (Exception e) {
Log.e("Error reading file", e.toString());
}
}

最佳答案

尽管您是在主线程上下载图像,但代码可能会起作用。这意味着当下载时间超过 5 秒时,您将看到著名的 ANR 对话框,并且您的应用程序将崩溃...

您应该在后台线程中下载您的图像,并将结果发布回您的主线程。回到主线程,您可以使用下载的图像更新 ImageView 。

这是一个例子:

package nl.entreco.stackoverflow;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.URL;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.widget.ImageView;

public class StackOverflowActivity extends Activity {

//
private ImageView mImageView;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);
setContentView(R.layout.main);

//Find the reference to the ImageView
mImageView = (ImageView) findViewById(R.id.test_image);

// You can set a temporary background here
//image.setImageResource(null);

// Start the DownloadImage task with the given url
new DownloadImage().execute("http://i.imgur.com/CQzlM.jpg");
}


/**
* Simple functin to set a Drawable to the image View
* @param drawable
*/
private void setImage(Drawable drawable)
{
mImageView.setBackgroundDrawable(drawable);
}

public class DownloadImage extends AsyncTask<String, Integer, Drawable> {

@Override
protected Drawable doInBackground(String... arg0) {
// This is done in a background thread
return downloadImage(arg0[0]);
}

/**
* Called after the image has been downloaded
* -> this calls a function on the main thread again
*/
protected void onPostExecute(Drawable image)
{
setImage(image);
}


/**
* Actually download the Image from the _url
* @param _url
* @return
*/
private Drawable downloadImage(String _url)
{
//Prepare to download image
URL url;
BufferedOutputStream out;
InputStream in;
BufferedInputStream buf;

//BufferedInputStream buf;
try {
url = new URL(_url);
in = url.openStream();

/*
* THIS IS NOT NEEDED
*
* YOU TRY TO CREATE AN ACTUAL IMAGE HERE, BY WRITING
* TO A NEW FILE
* YOU ONLY NEED TO READ THE INPUTSTREAM
* AND CONVERT THAT TO A BITMAP
out = new BufferedOutputStream(new FileOutputStream("testImage.jpg"));
int i;

while ((i = in.read()) != -1) {
out.write(i);
}
out.close();
in.close();
*/

// Read the inputstream
buf = new BufferedInputStream(in);

// Convert the BufferedInputStream to a Bitmap
Bitmap bMap = BitmapFactory.decodeStream(buf);
if (in != null) {
in.close();
}
if (buf != null) {
buf.close();
}

return new BitmapDrawable(bMap);

} catch (Exception e) {
Log.e("Error reading file", e.toString());
}

return null;
}

}

}

不要忘记将 permission.INTERNET 添加到您的 list 中,否则,您将收到错误...

关于android - 在 Android 上为 imageview 下载图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8423987/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com