gpt4 book ai didi

java - 如何从 Android 上的异步任务返回图像

转载 作者:行者123 更新时间:2023-11-29 21:09:14 24 4
gpt4 key购买 nike

我正在编写一个应用程序,我正在构建一个 ListView ,其中每个项目都有一个图像。 ListView 的内容由存储在本地的 XML 文件生成,图片从 Amazon AWS S3 中获取。

我想编写一个类 AWSImageFetcher,它首先负责身份验证(通过使用另一个专用类),然后负责获取图像。

我知道在这种情况下,Android 的最佳做法是子类化 AsyncTask 来执行网络请求。我现在想知道如何应该将图像从 AWSImageFetcher 类返回到 ListView 。

我来自 iOS,我只是为 AWSImageFetcher 编写一个委托(delegate),它会在获取图像后被调用,但这在 Android 上感觉不对。我应该改用监听器类吗?你会如何优雅地解决 Android 上的这种情况?

最佳答案

试试这个表格

onPreExecute 首先在 UIThread 中执行,然后 doInbakground 函数在并行线程中执行,然后 postExecute 在 UIThread 中运行

private class AWSImageFetcher extends AsyncTask<String, Void, Bitmap> 
{
boolean authenticated;

@Override
protected void onPreExecute()
{
super.onPreExecute();
authenticated=authenticate();
}

@Override
protected Bitmap doInBackground(String... urls)
{
Bitmap b=null;
if(authenticated)
{
URL imageUrl = new URL(urls[0]);
HttpURLConnection conn = (HttpURLConnection) imageUrl
.openConnection();
conn.setConnectTimeout(TIME_OUT_IN_MILLI_SECONDS);
conn.setReadTimeout(TIME_OUT_IN_MILLI_SECONDS);
conn.setInstanceFollowRedirects(true);
InputStream is = conn.getInputStream();
OutputStream os = new FileOutputStream(f);
Utils.CopyStream(is, os);
os.close();
b = decodeFile(f);
}
return b;
}

@Override
protected void onPostExecute(Bitmap result)
{
super.onPostExecute(result);
if(result!=null)
{
//use bitmap image in result
}
else
{
//Image is not available
}

}

}


//decodes image and scales it to reduce memory consumption
private Bitmap decodeFile(File f) {
try {
// decode image size
BitmapFactory.Options o = new BitmapFactory.Options();
o.inJustDecodeBounds = true;
FileInputStream stream1 = new FileInputStream(f);
BitmapFactory.decodeStream(stream1, null, o);
stream1.close();

// Find the correct scale value. It should be the power of 2.
final int REQUIRED_SIZE = 70;
int width_tmp = o.outWidth, height_tmp = o.outHeight;
int scale = 1;
while (true) {
if (width_tmp / 2 < REQUIRED_SIZE
|| height_tmp / 2 < REQUIRED_SIZE)
break;
width_tmp /= 2;
height_tmp /= 2;
scale *= 2;
}

// decode with inSampleSize
BitmapFactory.Options o2 = new BitmapFactory.Options();
o2.inSampleSize = scale;
FileInputStream stream2 = new FileInputStream(f);
Bitmap bitmap = BitmapFactory.decodeStream(stream2, null, o2);
stream2.close();
return bitmap;
} catch (FileNotFoundException e) {
} catch (IOException e) {
e.printStackTrace();
}
return null;
}

关于java - 如何从 Android 上的异步任务返回图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23493167/

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