package com.ywwxhz.data; import android.annotation.SuppressLint; import android.app.Notification; import android.app.NotificationManager; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Build; import android.os.Handler; import android.os.Looper; import android.os.Message; import android.widget.Toast; import com.loopj.android.http.TextHttpResponseHandler; import com.nostra13.universalimageloader.core.ImageLoader; import com.ywwxhz.MyApplication; import com.ywwxhz.cnbetareader.R; import com.ywwxhz.data.impl.NewsDetailProvider; import com.ywwxhz.entitys.NewsItem; import com.ywwxhz.lib.kits.FileCacheKit; import com.ywwxhz.lib.kits.LogKits; import com.ywwxhz.lib.kits.NetKit; import com.ywwxhz.lib.kits.PrefKit; import org.apache.http.Header; import java.lang.ref.WeakReference; import java.util.List; import java.util.Locale; import java.util.concurrent.atomic.AtomicReference; /** * cnBetaReader * <p/> * Created by 远望の无限(ywwxhz) on 2015/4/2 10:34. */ public class NewsCacheHandler extends Handler { private static final int MESSAGE_STOP = 3; private static final int MESSAGE_UPDATE_PROGRESS = 1; private static final int MESSAGE_FINISH_PROGRESS = 2; private int len; private int size = 0; private WeakReference<Context> context; private int failedCount = 0; private CacheThread thread; private int successCount = 0; private boolean start = false; private List<NewsItem> mCacheList; private NotificationManager manager; private Notification.Builder builder; private String stringFormate = "成功 %d 条 失败 %d 条"; private Bitmap largeLogo; public NewsCacheHandler(Context context) { super(Looper.getMainLooper()); this.context = new WeakReference<>(context); largeLogo = BitmapFactory.decodeResource(this.context.get().getResources(), R.mipmap.ic_launcher); init(); } private void init() { manager = (NotificationManager) context.get().getSystemService(Context.NOTIFICATION_SERVICE); builder = new Notification.Builder(context.get()); } @Override public void handleMessage(Message msg) { super.handleMessage(msg); AtomicReference<String> info = new AtomicReference<>(); switch (msg.what) { case MESSAGE_UPDATE_PROGRESS: info.set("正在缓存第 " + len + " 条新闻"); builder.setProgress(size, len, false); builder.setContentText(info.get()); manager.notify(0, notificationCompt(builder)); break; case MESSAGE_FINISH_PROGRESS: start = false; info.set(String.format(Locale.CHINA, stringFormate, successCount, failedCount)); Toast.makeText(context.get(), info.get(), Toast.LENGTH_SHORT).show(); manager.notify(0, notificationCompt(new Notification.Builder(context.get()) .setContentTitle("离线缓存已完成").setContentText(info.get()).setTicker("离线缓存已完成") .setSmallIcon(R.mipmap.ic_logo).setLargeIcon(largeLogo))); break; case MESSAGE_STOP: start = false; info.set(String.format(Locale.CHINA, stringFormate, successCount, failedCount)); Toast.makeText(context.get(), info.get(), Toast.LENGTH_SHORT).show(); manager.notify(0, notificationCompt(new Notification.Builder(context.get()) .setContentTitle("离线缓存已取消").setContentText(info.get()).setTicker("离线缓存已取消") .setSmallIcon(R.mipmap.ic_logo).setLargeIcon(largeLogo))); break; } } public void start() { if (!start) { this.start = true; builder.setProgress(0, 0, true); builder.setContentTitle("正在缓存新闻中"); builder.setContentText("请稍候"); builder.setTicker("正在离线缓存新闻"); builder.setSmallIcon(R.mipmap.ic_logo); builder.setLargeIcon(largeLogo); builder.setOngoing(true); manager.notify(0, notificationCompt(builder)); thread = new CacheThread("Cache Thread"); thread.start(); } } public void stop() { if (start) { thread.interrupt(); sendEmptyMessage(MESSAGE_STOP); } } @SuppressLint("NewApi") private Notification notificationCompt(Notification.Builder builder) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { return builder.build(); } else { return builder.getNotification(); } } public boolean isStart() { return start; } public void setCacheList(List<NewsItem> cacheList) { if (!start) { if(cacheList.size()>40){ mCacheList = cacheList.subList(0,40); }else { mCacheList = cacheList; } size = mCacheList.size(); } } public void cleanNotification() { manager.cancel(0); } private class CacheThread extends Thread { private boolean cacheImage; public CacheThread(String s) { super(s); cacheImage = PrefKit.getBoolean(context.get(),R.string.pref_offline_image_key,false); } @Override public void run() { len = 0; successCount = 0; failedCount = 0; for (final NewsItem item : mCacheList) { len++; post(new Runnable() { @Override public void run() { Message msg = new Message(); msg.what = MESSAGE_UPDATE_PROGRESS; msg.obj = len; sendMessage(msg); } }); if (FileCacheKit.getInstance().getAsObject(item.getSid() + "", NewsItem.class) == null) { if(PrefKit.getBoolean(context.get(),R.string.pref_show_list_news_image_key,true)) { Bitmap img = ImageLoader.getInstance().loadImageSync(item.getThumb(), MyApplication.getDefaultDisplayOption()); if (img != null) { img.recycle(); } } NetKit.getInstance().getNewsBySidSync(item.getSid() + "", new TextHttpResponseHandler() { @Override public void onFailure(int statusCode, Header[] headers, String responseString, Throwable throwable) { failedCount++; LogKits.e(item.getTitle() + " 缓存失败"); } @Override public void onSuccess(int statusCode, Header[] headers, String responseString) { successCount++; NewsDetailProvider.handleResponceString(item, responseString,true,cacheImage); } @Override public void onProgress(int bytesWritten, int totalSize) { } }); } } post(new Runnable() { @Override public void run() { sendEmptyMessage(MESSAGE_FINISH_PROGRESS); } }); } } }