在service中通过在oncreat()中开启一个线程,轮训ArrayList<AttachmentTask> 我这个附件下载的任务list ,ArrayList<AttachmentTask> 他维护的是一个当前下载的任务,每当下载完一个移除一个,同时下载完后添加到数据库。
/* * @project C6Client * @package com.jh.c6.service * @file DownloadService.java * @version 1.0 * @author liaoyp * @time 2012-5-17 上午2:55:19 */ package com.jh.c6.service; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.net.URLConnection; import java.util.ArrayList; import java.util.List; import android.app.Notification; import android.app.NotificationManager; import android.app.PendingIntent; import android.app.Service; import android.content.Intent; import android.os.Handler; import android.os.IBinder; import android.widget.Toast; import com.jh.c6.activity.C6ClientActivity; import com.jh.c6.activity.DownloadMangerActivity; import com.jh.c6.activity.R; import com.jh.c6.entity.AttachmentTask; import com.jh.c6.exception.POAException; import com.jh.c6.impl.DownloadDB; import com.jh.c6.util.Configure; public class DownloadService extends Service implements Runnable{ private NotificationManager manager; private Notification notif; private Intent intent; Handler handler = new Handler(){ public void handleMessage(android.os.Message msg) { if(msg.what == 1){ Toast.makeText(getApplicationContext(), "该附件已下载", 500).show(); startActivity(); }else if(msg.what == 2){ startActivity(); Toast.makeText(getApplicationContext(), "该附件正在下载", 500).show(); }else if(msg.what == 3){ // startActivity(); Toast.makeText(getApplicationContext(), "服务器不存在该附件!", 500).show(); }else{ manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); Notification notification = new Notification(R.drawable.ic_launcher,"附件下载中",System.currentTimeMillis()); intent = new Intent(); intent.setClass(getApplicationContext(), DownloadMangerActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP| Intent.FLAG_ACTIVITY_NEW_TASK); PendingIntent pendingIntent = PendingIntent.getActivity(getApplicationContext(), 100, intent, PendingIntent.FLAG_UPDATE_CURRENT); notification.setLatestEventInfo(getApplicationContext(), "附件下载", "下载完成!", pendingIntent); manager.notify(101, notification); Toast.makeText(getApplicationContext(), "下载完成", 500).show(); } }; }; //static LinkedList<AttachmentTask> attsTask = new LinkedList<AttachmentTask>(); public static ArrayList<AttachmentTask> attsTask = new ArrayList<AttachmentTask>(); public void startActivity(){ intent = new Intent(); intent.setClass(getApplicationContext(), DownloadMangerActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP| Intent.FLAG_ACTIVITY_NEW_TASK); DownloadService.this.startActivity(intent); } public boolean isRun; public final static int Max = 4; public static boolean stopDownload; static final Object NO_MORE_WORK = new Object(); private Thread t; private DownloadDB downloadDB; private Intent download; private File file; @Override public IBinder onBind(Intent intent) { return null; } /** * 最大限制 * @return */ public static boolean IsMaxNum (){ return attsTask.size()>=Max? true:false; } /** * 任务列表中是否存在还任务 * @param path * @return */ public static boolean isDownLoading(String path){ for (int i = 0; i < attsTask.size(); i++) { if(attsTask.get(i).getUri().equals(path)){ return true; } } return false; } /** * * <code>getTask</code> * @description: TODO(获取附件总数) * @return * @since 2012-4-18 liaoyp */ public static int getTask(){ if(UploadService.attsTask !=null) return attsTask.size(); else return 0; } /** * 是否下载完成! * @return */ public static boolean isDowloadFinshed(){ for (int i = 0; i < attsTask.size(); i++) { if(!attsTask.get(i).isOver()){ return false; } } return true; } /** * 服务器地址 * @return */ public static List<String> getDownloadServerPath(){ List<String> atts = null; if(attsTask !=null && attsTask.size()>0){ atts = new ArrayList<String>(); for (int i = 0; i < attsTask.size(); i++) { if(attsTask.get(i).isOver()){ atts.add(attsTask.get(i).getServerPath()); } } return atts; } return atts; } @Override public void onCreate() { super.onCreate(); isRun= true; t = new Thread(this); t.start(); } @Override public void onStart(Intent intent, int startId) { // TODO Auto-generated method stub super.onStart(intent, startId); if(intent !=null &&intent.getExtras() !=null){ if(t == null){ t = new Thread(this); t.start(); } String uri = (String) intent.getExtras().get("uri"); if(uri !=null){ for (int i = attsTask.size() -1; i >= 0; i--) { if(attsTask.get(i).getUri().equals(uri)){ stopDownload = true; attsTask.remove(i); System.out.println("cancle ---->"+attsTask.size()); this.sendBroadcast(new Intent(C6ClientActivity.updateDowload)); } } } } } @Override public int onStartCommand(Intent intent, int flags, int startId) { return super.onStartCommand(intent, flags, startId); } @Override public void run() { while(isRun) { try { if (attsTask.size() > 0) { for (int i = 0; i <attsTask.size(); i++) { AttachmentTask task = attsTask.get(i); if(! task.isUnSart()){ download(attsTask.get(i)); } } } else { try { Thread.sleep(500); } catch (Exception e) { } } }catch(Exception e){ System.out.println("error-----------------"+e); } } } private void download(AttachmentTask task) throws POAException { // TODO Auto-generated method stub // 开始上传 和 更新下载的进度显示 System.out.println("dowenload-----------------1"); task.setUnSart(true); task.setSarting(true); if(downloadDB == null){ downloadDB = new DownloadDB(); } String httpPath ; httpPath = task.getUri(); String loacalPath = downloadDB.getLocalpicPath(DownloadService.this, httpPath); System.out.println("localPath : "+loacalPath); if(loacalPath == null){ boolean b = isDownLoading(httpPath); if(b){ // 发送广播通知 removeTask(task); handler.sendEmptyMessage(2); }else{ // 下载 startDowload(task); } // Toast.makeText(getApplicationContext(), "开始下载", 500).show(); startDowload(task); }else{ File file = new File(loacalPath); if( ! file.exists()){ // 下载 startDowload(task); }else{ // 跳到附件管理界面 removeTask(task); handler.sendEmptyMessage(1); } } } public void startDowload(AttachmentTask task){ InputStream is = null; FileOutputStream fos = null; String httpPath = ""; try { httpPath = (Configure.IPADDRESS.replaceAll("POSTServiceForAndroid.svc", "")+"FileOutSteam.aspx?FileID="+ task.getUri()); System.out.println("http: "+httpPath); URLConnection connetion = new URL(httpPath).openConnection(); is=connetion.getInputStream(); // HttpGet httpGet = new HttpGet(task.getUri()); // HttpClient client = new DefaultHttpClient(); // HttpParams httpParams = client.getParams(); // HttpConnectionParams.setConnectionTimeout(httpParams,5000); // HttpConnectionParams.setSoTimeout(httpParams, 10000); // HttpResponse httpResponse = client.execute(httpGet); // if (httpResponse.getStatusLine().getStatusCode() == 200) { // // is = httpResponse.getEntity().getContent(); // 开始下载apk文件 String path = Configure.DATADIR+Configure.DownloadFile + "/"+task.getServerPath(); file = new File(path); if( ! file.exists()){ file.createNewFile(); } fos = new FileOutputStream(file); byte[] buffer = new byte[2048]; int count = 0; while ((count = is.read(buffer)) != -1) { if (stopDownload) { break ; } fos.write(buffer, 0, count); // 进行进度跟新 long current= task.getCurrentProgress(); current =task.getCurrentProgress() +count; task.setCurrentProgress(current); // send broadCast to mangeAttachmengActivity download = new Intent(C6ClientActivity.DowloadAction); download.putExtra("type", 0); this.sendBroadcast(download); System.out.println("下载中......"); } fos.flush(); removeTask(task); if(downloadDB != null){ downloadDB.insertPic(DownloadService.this, task.getUri(),path, Configure.ACCOUNTID); }else{ new DownloadDB().insertPic(DownloadService.this, task.getUri(),path, Configure.ACCOUNTID); } // 提示下载完成 ! // download = new Intent(C6ClientActivity.DowloadAction); // download.putExtra("type", 1); // this.sendBroadcast(download); handler.sendEmptyMessage(0); }catch (FileNotFoundException e) { e.printStackTrace(); handler.sendEmptyMessage(3); }catch (IOException e) { e.printStackTrace(); } finally{ try { if (fos != null) { fos.close(); } } catch (IOException e) { e.printStackTrace(); } try { if (is != null) { is.close(); } } catch (IOException e) { e.printStackTrace(); } } } public static void removeTask(AttachmentTask task){ if(attsTask.contains(task)){ attsTask.remove(task); } } public static void addTask(AttachmentTask task){ stopDownload = false; attsTask.add(task); } @Override public void onDestroy() { super.onDestroy(); isRun = false; } }