2021 5 6 团队博客 6
解决照片下载浏览功能,将照片通过oss对象下载到流对象,将流对象转换为bitmap对象,将bitmap显示带imageview中。
需要注意的是:照片的下载 尽量在子线程中完成,bitmap的显示也尽量在子线程中完成,如果将bitmap作为参数传递会显示不全。
除此之外,对image的设置不能在子线程中,需要
MainActivity.this.runOnUiThread
函数:
public void update()
{
new Thread(new Runnable() {
@Override
public void run() {
final ImageView image = findViewById(R.id.image);
OSSCredentialProvider credentialProvider = new OSSPlainTextAKSKCredentialProvider(ACCESS_ID, ACCESS_KEY);
ClientConfiguration conf = new ClientConfiguration();
conf.setConnectionTimeout(15 * 1000); // 连接超时,默认15秒
conf.setSocketTimeout(15 * 1000); // socket超时,默认15秒
conf.setMaxConcurrentRequest(8); // 最大并发请求数,默认5个
conf.setMaxErrorRetry(2); // 失败后最大重试次数,默认2次
// oss为全局变量,OSS_ENDPOINT是一个OSS区域地址
oss = new OSSClient(getApplicationContext(), OSS_ENDPOINT, credentialProvider, conf);
//构造下载文件请求
//objectKey等同于objectName,表示从OSS下载文件时需要指定包含文件后缀在内的完整路径,例如abc/efg/123.jpg
GetObjectRequest get = new GetObjectRequest("sean1246", "???");
//设置下载进度回调
get.setProgressListener(new OSSProgressCallback<GetObjectRequest>() {
@Override
public void onProgress(GetObjectRequest request, long currentSize, long totalSize) {
OSSLog.logDebug("getobj_progress:" + currentSize + "total_size:" + totalSize, false);
}
});
try {
// 同步执行下载请求,返回结果
GetObjectResult getResult = oss.getObject(get);
Log.d("Content-Length是", "" + getResult.getContentLength());
// 获取文件输入流
InputStream inputStream = getResult.getObjectContent();
bitmap= BitmapFactory.decodeStream(inputStream);
bitmap=zoomImg(bitmap,600,600);
MainActivity.this.runOnUiThread(new Runnable() {
public void run() {
image.setImageBitmap(bitmap);
}
});
ObjectMetadata metadata = getResult.getMetadata();
Log.d("ContentType", metadata.getContentType());
} catch (ClientException e) {
// 本地异常如网络异常等
e.printStackTrace();
} catch (ServiceException e) {
// 服务异常
Log.e("RequestId", e.getRequestId());
Log.e("ErrorCode", e.getErrorCode());
Log.e("HostId", e.getHostId());
Log.e("RawMessage", e.getRawMessage());
}
}
}).start();
}

浙公网安备 33010602011771号