首页 > 代码库 > android 后台附件下载

android 后台附件下载

 在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;	}	}

  

android 后台附件下载