在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;@Overridepublic 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;}@Overridepublic void onCreate() {super.onCreate(); isRun= true; t = new Thread(this); t.start();}@Overridepublic void onStart(Intent intent, int startId) {// TODO Auto-generated method stubsuper.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));}}}}}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {return super.onStartCommand(intent, flags, startId);}@Overridepublic 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 mangeAttachmengActivitydownload = 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);}@Overridepublic void onDestroy() {super.onDestroy();isRun = false;}}

  

更多相关文章

  1. Gradle 安装以及查看jar文件本地的存储位置
  2. android内部培训视频_第四节(1)_异步网络操作
  3. Android计算下载速度
  4. android 的NDK在Windwos环境搭建(一)
  5. Android(安卓)下载网络图片注意的问题
  6. AsyncTask进度条加载网站数据到ListView
  7. android初入门工具及配置
  8. android开发工具简介及下载地址
  9. Android(安卓)SDK下载项的说明

随机推荐

  1. android获取存储卡使用情况
  2. android ImageSwitcher案例
  3. android:使用webview加载网页
  4. android的互联网开发 下
  5. Android左右滑动菜单
  6. Android- Button Transparent
  7. android 网络状态监听
  8. Android(安卓)Recyclerview 滚动事件监听
  9. 在Android中创建文件
  10. android相机camera拍照