国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 系統(tǒng) > Android > 正文

Android使用Handler實(shí)現(xiàn)下載文件功能

2019-10-22 18:09:58
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

本文實(shí)例為大家分享了Android實(shí)現(xiàn)下載文件的具體代碼,供大家參考,具體內(nèi)容如下

1.實(shí)現(xiàn)效果

直接上圖: 

Android,Handler,下載文件

2.代碼實(shí)現(xiàn)

在AndroidManifest.xml文件中聲明申請(qǐng)的權(quán)限,如下所示:

<uses-permission android:name="android.permission.INTERNET" /><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

新建一個(gè)名為DownloadDemo的項(xiàng)目,activity_main.xml代碼如下:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center_horizontal" android:orientation="vertical" tools:context=".MainActivity"> <Button  android:id="@+id/button"  android:layout_width="wrap_content"  android:layout_height="wrap_content"  android:layout_marginTop="10dp"  android:text="下載" /> <ProgressBar  android:id="@+id/progressBar"  style="?android:attr/progressBarStyleHorizontal"  android:layout_width="match_parent"  android:layout_height="wrap_content"  android:layout_margin="10dp"  android:max="100"  android:progress="0" /></LinearLayout>

MainActivity.class代碼如下:

public class MainActivity extends AppCompatActivity implements View.OnClickListener { public static final String APP_URL = "http://download.sj.qq.com/upload/connAssitantDownload/upload/MobileAssistant_1.apk"; public static final int DOWNLOAD_MESSAGE_CODE = 100001; private static final int DOWNLOAD_MESSAGE_FAIL_CODE = 100002; public static final int REQUEST_CODE = 1; private Button button; private ProgressBar progressBar; private MyHandler mHandler; @Override protected void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentView(R.layout.activity_main);  initView();  askPermission();  mHandler = new MyHandler(this); } public static class MyHandler extends Handler {  final WeakReference<MainActivity> mWeakReference;  public MyHandler(MainActivity activity) {   this.mWeakReference = new WeakReference<>(activity);  }  @Override  public void handleMessage(Message msg) {   MainActivity activity = mWeakReference.get();   super.handleMessage(msg);   switch (msg.what) {    case DOWNLOAD_MESSAGE_CODE:     activity.progressBar.setProgress((Integer) msg.obj);     if (((Integer) msg.obj) == 100) {      Toast.makeText(activity, "文件下載已完成!", Toast.LENGTH_SHORT).show();     }     break;    case DOWNLOAD_MESSAGE_FAIL_CODE:     Toast.makeText(activity, "文件下載失敗!", Toast.LENGTH_SHORT).show();     break;   }  } } /**  * 申請(qǐng)權(quán)限  */ private void askPermission() {  //將所需申請(qǐng)的權(quán)限添加到List集合中  List<String> permissionList = new ArrayList<>();  if (ContextCompat.checkSelfPermission(MainActivity.this,    Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {   permissionList.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);  }  //判斷權(quán)限列表是否為空,若不為空,則向用戶申請(qǐng)權(quán)限,否則則直接執(zhí)行操作  if (!permissionList.isEmpty()) {   String[] permissions = permissionList.toArray(new String[permissionList.size()]);   ActivityCompat.requestPermissions(MainActivity.this, permissions, REQUEST_CODE);  } else {   //TODO   button.setOnClickListener(this);  } } /**  * 用戶對(duì)請(qǐng)求權(quán)限的dialog做出響應(yīng)之后,會(huì)處理請(qǐng)求權(quán)限的響應(yīng)  *  * @param requestCode 請(qǐng)求碼  * @param permissions 權(quán)限的集合  * @param grantResults 權(quán)限授予的結(jié)果  */ @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {  super.onRequestPermissionsResult(requestCode, permissions, grantResults);  switch (requestCode) {   case REQUEST_CODE:    if (grantResults.length > 0) {     for (int result : grantResults) {      if (result != PackageManager.PERMISSION_GRANTED) {       Toast.makeText(this, "必須同意所有權(quán)限才能使用本程序", Toast.LENGTH_SHORT).show();       finish();       return;      }     }     //TODO     button.setOnClickListener(this);    } else {     Toast.makeText(this, "權(quán)限申請(qǐng)失敗!", Toast.LENGTH_SHORT).show();     finish();    }    break;   default:    break;  } } /**  * 點(diǎn)擊事件  *  * @param v  */ @Override public void onClick(View v) {  switch (v.getId()) {   case R.id.button:    new Thread(new Runnable() {     @Override     public void run() {      download(APP_URL);     }    }).start();    break;  } } /**  * 下載  *  * @param appUrl  */ private void download(String appUrl) {  try {   //實(shí)例化一個(gè)url對(duì)象   URL url = new URL(appUrl);   //獲取URLConnection對(duì)象   URLConnection urlConnection = url.openConnection();   //獲取輸入流   InputStream inputStream = urlConnection.getInputStream();   //獲取文件的總長(zhǎng)度   int contentLength = urlConnection.getContentLength();   //設(shè)置軟件下載到手機(jī)存儲(chǔ)的位置文件夾名稱   String downloadFolderName = Environment.getExternalStorageDirectory()     + File.separator + "MyApp" + File.separator;   File file = new File(downloadFolderName);   //若文件夾不存在則進(jìn)行創(chuàng)建   if (!file.exists()) {    file.mkdir();   }   String fileName = downloadFolderName + "chaixingsi.apk";   File apkFile = new File(fileName);   if (apkFile.exists()) {    apkFile.delete();   }   int downloadContentLength = 0;   int length = 0;   byte[] bytes = new byte[1024];   OutputStream outputStream = new FileOutputStream(fileName);   while ((length = inputStream.read(bytes)) != -1) {    outputStream.write(bytes, 0, length);    downloadContentLength += length;    /**     * 發(fā)送消息通知主線程去更新UI     */    Message message = Message.obtain();    message.obj = downloadContentLength * 100 / contentLength;    message.what = DOWNLOAD_MESSAGE_CODE;    mHandler.sendMessage(message);   }   inputStream.close();   outputStream.close();  } catch (MalformedURLException e) {   //下載失敗的話也發(fā)送消息   notifyDownloadFailed();   e.printStackTrace();  } catch (IOException e) {   notifyDownloadFailed();   e.printStackTrace();  } } /**  * 通知下載失敗  */ private void notifyDownloadFailed() {  Message message = Message.obtain();  message.what = DOWNLOAD_MESSAGE_FAIL_CODE;  mHandler.sendMessage(message); } /**  * 初始化視圖  */ private void initView() {  button = findViewById(R.id.button);  progressBar = findViewById(R.id.progressBar); }}

3.快捷鍵總結(jié)

提取方法:Ctrl+Alt+M; 
提取變量:Ctrl+Alt+V; 
提取常量:Ctrl+Alt+C;

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持VEVB武林網(wǎng)。


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到Android開(kāi)發(fā)頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 拉萨市| 扬州市| 临沂市| 黎城县| 兰坪| 防城港市| 巧家县| 白水县| 行唐县| 瑞金市| 吉首市| 樟树市| 庆元县| 南宫市| 石棉县| 伊通| 乌什县| 大姚县| 临猗县| 东平县| 沐川县| 宜川县| 武定县| 西安市| 克拉玛依市| 扶绥县| 丘北县| 杨浦区| 祁东县| 莒南县| 安化县| 航空| 黔江区| 巨野县| 台南市| 神农架林区| 安达市| 农安县| 富裕县| 台安县| 逊克县|