package com.shejiaomao.weibo.service.task; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import com.shejiaomao.maobo.R; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.ResponseHandler; import android.app.Activity; import android.app.ProgressDialog; import android.content.DialogInterface; import android.content.DialogInterface.OnCancelListener; import android.content.Intent; import android.graphics.BitmapFactory; import android.os.AsyncTask; import android.util.Log; import android.view.WindowManager.BadTokenException; import android.widget.Toast; import com.cattong.commons.LibException; import com.cattong.commons.LibResultCode; import com.cattong.commons.LibRuntimeException; import com.cattong.commons.Logger; import com.cattong.commons.http.HttpRequestHelper; import com.cattong.commons.util.ArrayUtil; import com.cattong.commons.util.FileUtil; import com.cattong.commons.util.StringUtil; import com.shejiaomao.common.ImageUtil; import com.shejiaomao.common.ResourceBook; import com.shejiaomao.weibo.activity.ImageViewer4GifActivity; import com.shejiaomao.weibo.activity.ImageViewerActivity; import com.shejiaomao.weibo.activity.ImageWebViewerActivity; import com.shejiaomao.weibo.common.CacheManager; import com.shejiaomao.weibo.service.cache.ImageCache; import com.shejiaomao.weibo.service.cache.wrap.CachedImage; import com.shejiaomao.weibo.service.cache.wrap.CachedImageKey; public class ImageLoad4BigTask extends AsyncTask<Void, Integer, CachedImage> { private static final String LOG_TAG = ImageLoad4BigTask.class.getSimpleName(); private static final int WEB_VIEW_MIN_SIZE = 800 * 800; private ImageCache imageCache; private CachedImageKey imageInfo; private boolean isHit = false; private Activity context; private ProgressDialog progressDialog; private String url; private String resultMsg; public ImageLoad4BigTask(Activity context, String url) { this.context = context; this.url = url; this.imageCache = (ImageCache) CacheManager.getInstance().getCache(ImageCache.class.getName()); imageInfo = new CachedImageKey(url, CachedImageKey.IMAGE_MIDDLE); if (url != null && imageCache.containsKey(imageInfo)) { isHit = true; } } @Override protected void onPreExecute() { super.onPreExecute(); try { progressDialog = new ProgressDialog(context); progressDialog.setMessage(context.getString(R.string.msg_big_image_loading)); progressDialog.setCancelable(true); progressDialog.setOnCancelListener(onCancelListener); progressDialog.setOwnerActivity(context); progressDialog.setMax(100); progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); progressDialog.show(); if (isHit) { cancel(true); onPostExecute(null); } } catch (BadTokenException e) { if (Logger.isDebug()) { Log.d(LOG_TAG, e.getMessage(), e); } cancel(true); } } @Override protected CachedImage doInBackground(Void... params) { CachedImage wrap = null; if (url == null) { return wrap; } if(Logger.isDebug()) Log.i(LOG_TAG, "Get middle image from remote!"); String filePath = ImageCache.getImageSavePath(imageInfo); File destFile = new File(filePath); try { //destFile = ImageUtil.getFileByUrl(url, destFile); ProgressResponseHandler progressResponseHandler = new ProgressResponseHandler(destFile); destFile = HttpRequestHelper.getContent(url, progressResponseHandler); } catch (LibException e) { if (Logger.isDebug()) Log.e(LOG_TAG, e.getMessage(), e); resultMsg = ResourceBook.getResultCodeValue(e.getErrorCode(), context); destFile.delete(); } return wrap; } @Override protected void onProgressUpdate(Integer... values) { super.onProgressUpdate(values); if (ArrayUtil.isEmpty(values)) { return; } int value = values[0]; progressDialog.setProgress(value); } @Override protected void onPostExecute(CachedImage result) { super.onPostExecute(result); if (progressDialog == null) { return; } if (progressDialog.isShowing()) { try { progressDialog.dismiss(); } catch(Exception e) {} } if (StringUtil.isNotEmpty(resultMsg)) { Toast.makeText(context, resultMsg, Toast.LENGTH_SHORT).show(); return; } String realPath = ImageCache.getRealPath(imageInfo); BitmapFactory.Options options = ImageUtil.getBitmapOptions(realPath); double width = options.outWidth; double height = options.outHeight; Intent intent = new Intent(); if ((width > 0 && (height / width > 3)) || (width * height > WEB_VIEW_MIN_SIZE)) { //较长的图片,使用WebView来显示,同时传递图片的长宽数值 intent = new Intent(context, ImageWebViewerActivity.class); intent.putExtra("image-width", width); intent.putExtra("image-hight", height); } else { if (FileUtil.isGif(realPath)) { intent = new Intent(context, ImageViewer4GifActivity.class); //intent.setFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); } else { intent = new Intent(context, ImageViewerActivity.class); } } intent.putExtra("image-path", realPath); intent.putExtra("mode", ImageViewerActivity.Mode.View.toString()); context.startActivity(intent); } private OnCancelListener onCancelListener = new OnCancelListener() { public void onCancel(DialogInterface dialog) { ImageLoad4BigTask.this.cancel(true); String filePath = ImageCache.getImageSavePath(imageInfo); File imageFile = new File(filePath); imageFile.delete(); } }; class ProgressResponseHandler implements ResponseHandler<File> { private File file; public ProgressResponseHandler(File file) { this.file = file; } @Override public File handleResponse(HttpResponse response) throws ClientProtocolException, IOException { if (file == null) { throw new LibRuntimeException(LibResultCode.E_PARAM_NULL); } return writeToFile(response.getEntity()); } public File writeToFile(final HttpEntity entity) throws ClientProtocolException, IOException { if (entity == null) { throw new LibRuntimeException(LibResultCode.E_PARAM_ERROR); } InputStream instream = entity.getContent(); if (instream == null) { return null; } long contentLength = entity.getContentLength(); if (contentLength > Integer.MAX_VALUE) { throw new LibRuntimeException(LibResultCode.E_PARAM_ERROR); } Logger.verbose("FileResponseHandler Content Type : {}", entity.getContentType()); if (!file.exists()) { file.createNewFile(); } FileOutputStream fos = null; int readedLength = 0; try { fos = new FileOutputStream(file); byte[] tmp = new byte[4096]; int l; while ((l = instream.read(tmp)) != -1) { fos.write(tmp, 0, l); readedLength += l; //显示进度; publishProgress((int)(readedLength * 100/contentLength)); } fos.flush(); } catch (FileNotFoundException e) { Logger.debug(e.getMessage(), e); } finally { instream.close(); fos.close(); } return file; } } }