亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

Android類FileDownloadList分析

2020-04-11 11:47:43
字體:
來源:轉載
供稿:網友

先上代碼,再來分析

public class FileDownloadList {  /**上下文*/ private Context mContext; /**請求對象*/ private BaseRequestLims fileRequest = null; /**進度條對話框*/ private AlertDialog progressDialog = null; /**進度條控件變量*/ private ProgressBar mProgress; /**百分比顯示控件*/ private TextView mProgressPercent;  private File localFile = null; /**接收HttpHelper中獲取到文件大小后發送的廣播,確定文件大小*/ private DownLoadReceiver receiver; /**文件大小*/ private long fileLength = -1L; /**是否已注冊廣播標志*/ private boolean castFlag = false; /**是否顯示進度條標志*/ private boolean showDialog = false; /**文件下載完的回調接口*/ private Runnable mCallback = null;  private Handler mHandler = new Handler(){  @Override  public void handleMessage(Message msg) {   super.handleMessage(msg);   int tempSize = (int)localFile.length();   if(tempSize < fileLength){//文件下載中        if(showDialog){//顯示了進度條的情況下,更新進度條          int progress = (int)((Double.valueOf(tempSize) / Double.valueOf(fileLength)) * 100);          mProgress.setProgress(tempSize);          mProgressPercent.setText(progress + "%");        }      }else{//下載文件完畢    if(castFlag){//如已注冊廣播,注銷廣播      mContext.unregisterReceiver(receiver);      castFlag = false;      }    if(showDialog){     mProgress.setProgress((int)fileLength);     mProgressPercent.setText("100%");     progressDialog.dismiss();    }              if(mCallback != null){     try{      Thread.sleep(500);      mCallback.run();     }catch (Exception e) {      e.printStackTrace();     }    }   }  } };  /**  * 構造器  * @param activity  */  /**  * 構造器  * @param activity  * @param showDialog 顯示進度條標志  */ public FileDownloadList(Context context, boolean showDialog){  mContext = context;  this.showDialog = showDialog;  fileRequest = new BaseRequestLims(context,ClientServiceType.FILE_DOWN);  fileRequest.setMethodType(BaseRequestLims.METHOD_TYPE_POST);  fileRequest.setContext(mContext);     }  public BaseRequestLims getFileRequest(){  return fileRequest; }  /**  * 通過關聯類型來下載文件  * @param fileName 文件名稱或文件在服務器上的相對路徑加名稱  * @param saveDir 保存在本地的文件目錄  * @param saveName 保存在本地的文件名稱  * @param gllx 關聯類型  * @param callback 下載后的處理線程  */ public void downloadFile(String fileName, String saveDir, String saveName, Runnable callback){  if(callback != null){   mCallback = callback;  }    File saveDirFile = new File(saveDir);    //judge the save dir path exist or not   if(!saveDirFile.exists()){   saveDirFile.mkdirs();  }  localFile = new File(saveDir,saveName);    if(localFile.isDirectory()){   new AlertDialog.Builder(mContext).setTitle("提示").setMessage("the save file is directory").show();   return;  }  if(fileRequest.getServiceType()==null){   fileRequest.setServiceType(ClientServiceType.FILE_DOWN);  }  fileRequest.addParameter("fpath", fileName);  fileRequest.addParameter("fname", saveName);  fileRequest.setStreamPath(localFile.getAbsolutePath());  fileRequest.setStream(true);  if(localFile.exists()){   if(localFile.length() == 0){    invokeFile(fileRequest);   }else{    //文件存在直接打開    if(showDialog)     buildProgressDialog().show();    mHandler.sendMessage(mHandler.obtainMessage());   }  }else{   invokeFile(fileRequest);  } }  /**  * 進入文件下載子線程  * @param request  */ private void invokeFile(final BaseRequestLims request){  try{   if(showDialog){    buildProgressDialog().show();   }   receiver = new DownLoadReceiver();   IntentFilter filter = new IntentFilter();   filter.addAction("SAVE_DOWNLOAD_FILE");   mContext.registerReceiver(receiver, filter);   castFlag = true;   //下載的子線程   new Thread(){    @Override    public void run() {     super.run();     HttpHelper.invoke(request);    }   }.start();  }catch (Exception e) {   e.printStackTrace();  } }  /**  * 創建進度對話框  * @return  */ private AlertDialog buildProgressDialog(){  AlertDialog.Builder builder = new Builder(mContext);  builder.setTitle("正在下載文件,請稍候...");  RelativeLayout container = new RelativeLayout(mContext);  mProgress = new ProgressBar(mContext);  mProgress.setId("progress".hashCode());  BeanUtils.setFieldValue(mProgress, "mOnlyIndeterminate", Boolean.valueOf(false));  mProgress.setIndeterminate(false);  LayerDrawable layerDrawable = (LayerDrawable)mContext.getResources().getDrawable(android.R.drawable.progress_horizontal);  ClipDrawable clipDrawable = (ClipDrawable)layerDrawable.getDrawable(2);  clipDrawable.setColorFilter(Color.parseColor("#32B5E5"), Mode.SRC_IN);  mProgress.setProgressDrawable(layerDrawable);  mProgress.setPadding(0, 0, 0, 0);  mProgress.setIndeterminateDrawable(    mContext.getResources().getDrawable(android.R.drawable.progress_indeterminate_horizontal));  mProgressPercent = new TextView(mContext);  mProgressPercent.setId("percent".hashCode());  mProgressPercent.setText("0%");  mProgressPercent.setTextSize(18);    int containerPadding = DimensionUtils.dip2Px(mContext, 10);  container.setPadding(containerPadding, containerPadding, containerPadding, containerPadding);    LayoutParams progressLayoutParams = new LayoutParams(    LayoutParams.MATCH_PARENT, DimensionUtils.dip2Px(mContext, 4));  progressLayoutParams.addRule(RelativeLayout.CENTER_VERTICAL);  progressLayoutParams.addRule(RelativeLayout.LEFT_OF, mProgressPercent.getId());  mProgress.setLayoutParams(progressLayoutParams);    LayoutParams percentLayoutParams = new LayoutParams(    LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);  percentLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);  percentLayoutParams.addRule(RelativeLayout.CENTER_VERTICAL);  mProgressPercent.setLayoutParams(percentLayoutParams);    container.addView(mProgressPercent);  container.addView(mProgress);  builder.setView(container);  builder.setNegativeButton("取消", new OnClickListener() {    @Override   public void onClick(DialogInterface dialog, int which) {    dialog.dismiss();   }  });    progressDialog = builder.create();  return progressDialog; }  class DownLoadReceiver extends BroadcastReceiver{  @Override  public void onReceive(Context context, Intent intent) {   //顯示進度條   fileLength = intent.getLongExtra("FILE_LENGTH", -1);   if(showDialog){    mProgress.setMax((int)fileLength);   }   //更新進度條的線程   new Thread(){    @Override    public void run() {     super.run();     while(true){      try{       Thread.sleep(500);      }catch (Exception e) {       e.printStackTrace();      }      mHandler.sendMessage(mHandler.obtainMessage());      //獲取下載文件的大小      int loadedSize = (int)localFile.length();      if(loadedSize >= fileLength){       break;      }     }    }   }.start();  } }  public DownLoadReceiver getReciver() {  return receiver; }}

它的邏輯:

創建一個FileDownloadList對象后,就可以直接使用該下述方法來實現下載功能。

downloadFile(String fileName, String saveDir, String saveName, Runnable callback)

在實現上是這么個意思:

1.在當前上下文,開啟下載線程。當獲取到要下載的文件的大小時,發送一個廣播過來(這部分沒有展示在上述代碼中)。

2.在當前上下文中,注冊一個廣播監聽器,監聽廣播標識為SAVE_DOWNLOAD_FILE的廣播。首次監聽到發出來的廣播后,首次發送過來的廣播,包含了要下載的文件的大小信息,然后就每隔5毫秒檢測本地文件的大小,直到本地文件的大小(loadedSize)大于等于要下載的文件(fileLength)大小時,退出該循環。

在不斷檢測的過程中,通過mHandler.sendMessage(mHandler.obtainMessage()); ,讓UI線程更新進度條。

下載線程,會不斷將服務器返回的數據流,寫到本地文件中,所以,本地文件的大小會不斷變化,直到,它的大小跟要下載的文件的大小相等時,就退出這個不斷檢測本地文件大小的線程。

其它沒有在上述代碼中表現出來的內容(在其它部分的代碼中):

1.在invokeFile( final BaseRequestLims request)方法中,開了一個如下的下載線程.該下載線程,會將服務器返回的文件流,寫到本地文件(localFile)中;然后,它還會發送一個標識為SAVE_DOWNLOAD廣播,包含的信息有要下載文件的文件大小fileLength。

//下載的子線程   new Thread(){    @Override    public void run() {     super.run();     HttpHelper.invoke(request);    }   }.start();

上述代碼存在的問題:

1.上下文,使用的是某個Activity,如果發生系統調用了該Activity的onDestroy()時,下載線程還沒有完成,也就意味著,loadedSize的大小還是小于fileLength。從而,那個不斷檢測本地文件大小的線程就一直在執行著。

即是檢測本地文件大小的線程和下載線程還在執行著:

檢測本地文件大小的線程:

new Thread(){    @Override    public void run() {     super.run();     while(true){      try{       Thread.sleep(500);      }catch (Exception e) {       e.printStackTrace();      }      mHandler.sendMessage(mHandler.obtainMessage());      //獲取下載文件的大小      int loadedSize = (int)localFile.length();      if(loadedSize >= fileLength){       break;      }     }    }   }.start();

下載線程:

new Thread(){        @Override        public void run() {          super.run();          HttpHelper.invoke(request);        }      }.start();

那么,會出現什么問題呢?

1).我可以確定的就是,mContext會出現泄漏。

2). DownLoadReceiver不能正常被取消注冊。

分析,待續。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
岛国av午夜精品| 国产在线视频2019最新视频| 国产精品免费视频xxxx| 91精品视频大全| 国产999在线| 麻豆乱码国产一区二区三区| 亚洲国产黄色片| 精品国偷自产在线| 人体精品一二三区| 亚洲片av在线| 亚洲性夜色噜噜噜7777| 久久久99久久精品女同性| 欧美激情a∨在线视频播放| 欧美另类69精品久久久久9999| 欧美刺激性大交免费视频| 视频在线观看99| 中文字幕自拍vr一区二区三区| 欧美日韩日本国产| 国产一区二区三区在线观看网站| 亚洲成人中文字幕| 欧美老女人性生活| 国产精品亚洲激情| 中文字幕日韩欧美精品在线观看| 狠狠色噜噜狠狠狠狠97| 国产精品福利在线| 国产亚洲人成网站在线观看| 日韩成人中文字幕| 亚洲国产另类 国产精品国产免费| 国产自产女人91一区在线观看| 亚洲国产成人精品久久久国产成人一区| 欧美自拍大量在线观看| 久久国产视频网站| 欧美日韩电影在线观看| 成人国产精品日本在线| 亚洲视屏在线播放| 欧美电影第一页| 91精品久久久久| 91精品国产高清久久久久久91| 国产精品视频免费在线| 久久久国产精品视频| 精品av在线播放| 亚洲精品黄网在线观看| 日韩欧美亚洲一二三区| 国产日韩精品在线| 国产偷国产偷亚洲清高网站| 青草成人免费视频| 亚洲一区二区久久| 国产精品福利观看| 92版电视剧仙鹤神针在线观看| 91日韩在线视频| 97av在线视频| 69久久夜色精品国产69| 日本欧美一级片| 久久视频免费观看| 5278欧美一区二区三区| 日韩高清免费观看| 亚洲精品一区av在线播放| 日韩精品在线免费观看视频| 中文字幕在线观看亚洲| 国产精品欧美一区二区三区奶水| 成人欧美一区二区三区黑人孕妇| 欧美第一淫aaasss性| 亚洲成人国产精品| 97精品国产97久久久久久| 日韩电影中文 亚洲精品乱码| 亚洲国产精品久久久久秋霞不卡| xvideos成人免费中文版| 国内伊人久久久久久网站视频| 成人在线小视频| 日韩欧美中文字幕在线观看| 欧美成人中文字幕| 久久国产精品久久久久久| 亚洲国产成人在线视频| 国产成人精品一区| 亚洲欧美日本伦理| 午夜精品一区二区三区视频免费看| 国产精品久久久久久久久久久久| 一区二区三区回区在观看免费视频| 国产69精品久久久久99| 亚洲国产91精品在线观看| 日韩av网址在线| 精品色蜜蜜精品视频在线观看| 日韩亚洲一区二区| 国产美女精品视频免费观看| 亚洲欧美三级伦理| 亚洲午夜未满十八勿入免费观看全集| 日韩激情av在线免费观看| 成人黄色在线播放| 日韩精品在线视频| 日韩视频在线免费观看| 国产亚洲视频在线| 视频在线观看一区二区| 亚洲精品欧美日韩专区| 日韩在线欧美在线国产在线| 91国自产精品中文字幕亚洲| 亚洲色无码播放| 韩曰欧美视频免费观看| 亚洲级视频在线观看免费1级| 欧美日韩一区二区精品| 57pao成人国产永久免费| 欧美激情精品久久久| 亚州精品天堂中文字幕| 中文字幕久久久| 黑人精品xxx一区| 亚洲欧美在线播放| 免费91在线视频| 91精品国产自产在线老师啪| 国产精品欧美日韩久久| 日韩国产精品视频| 最近的2019中文字幕免费一页| 中文字幕日韩av| 国产九九精品视频| 奇门遁甲1982国语版免费观看高清| 久久精品这里热有精品| 欧美在线视频免费观看| 欧美日韩国产在线播放| 不卡av电影在线观看| 国产精品久久久久久久久影视| 国产精品爱啪在线线免费观看| 韩剧1988免费观看全集| 久久国产精品影视| 亚洲黄色片网站| 亚洲欧美日韩在线一区| 久久精品国产亚洲精品2020| 欧美高跟鞋交xxxxxhd| 国产精品揄拍500视频| 欧美精品videossex88| 97在线视频观看| 成人国产在线视频| 久久久久久亚洲精品不卡| 少妇久久久久久| 欧美性感美女h网站在线观看免费| 亚洲第一精品电影| 国产精品日韩在线一区| 欧美在线观看一区二区三区| 国内精品中文字幕| 在线观看国产欧美| 久久精品夜夜夜夜夜久久| 国产aⅴ夜夜欢一区二区三区| 91精品中国老女人| 78色国产精品| 中文字幕亚洲无线码a| 中文字幕欧美国内| 成人国产亚洲精品a区天堂华泰| 亚洲性69xxxbbb| 国产精品日韩欧美综合| 国产精品日韩专区| 国内精品久久久久久中文字幕| 97精品久久久| 深夜福利一区二区| 欧美午夜www高清视频| 亚洲成人激情视频| 国产精品国产三级国产专播精品人| 国产第一区电影| 夜色77av精品影院| 91高潮在线观看| 韩国福利视频一区| 欧美剧在线观看| 色偷偷9999www| 国产一区二区在线播放| 日韩高清av一区二区三区| 亚洲成人av片在线观看| 91精品久久久久久久久久入口| 日韩电影中文字幕在线观看|