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)