解决照片下载浏览功能,将照片通过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(); }