加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

AsyncTask异步实现文件下载

发布时间:2020-12-14 23:52:12 所属栏目:Java 来源:网络整理
导读:今天PHP站长网 52php.cn把收集自互联网的代码分享给大家,仅供参考。 Params 启动任务执行的输入参数,如网络请求的URL。 Progress 后台进行中任务执行进度百分比。 Result 后台执行任务完成最终返回的结果,比如String,

以下代码由PHP站长网 52php.cn收集自互联网

现在PHP站长网小编把它分享给大家,仅供参考

  • Params 启动任务执行的输入参数,如网络请求的URL。
  • Progress 后台进行中任务执行进度百分比。
  • Result 后台执行任务完成最终返回的结果,比如String,Bitmap等。
  • doInBackground(Params…) 后台执行,耗时的操作都可以放在这里(这里不能直接操作UI)。在执行过程中可以调用publicProgress(Progress…)来更新任务的进度,并用进度条显示出来。
  • onPostExecute(Result)? 相当于Handler 处理UI的方式,在这里面可以使用在doInBackground 得到的结果处理操作UI。 此方法在主线程执行,任务执行的结果作为此方法的参数返回。
  • onProgressUpdate(Progress…)?? 可以使用进度条增加用户体验度。 此方法在主线程执行,用于显示任务执行的进度。
  • onPreExecute() 当任务执行之前开始调用此方法,可以在这里显示进度对话框。
  • onCancelled() ? 用户调用取消时,要做的操作可以放到这里面处理。
  • AsyncTask的实例和execute方法必须在UI线程中创建,
  • 不要手动调用onPreExecute(),onPostExecute(Result),doInBackground(Params...),onProgressUpdate(Progress...)这4个方法,
  • 该实现的AsyncTask只能被执行一次,否则多次调用时将会出现异常; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??下面是我们实现文件下载的例子:
  • 布局:
    <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:orientation="vertical" >
    
    
        <Button
            android:id="@+id/file_download_btn"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:textSize="16sp"
            android:text="下载文件" />
    
    
    </LinearLayout>
  • Activity代码:
    public class MainActivity extends Activity implements OnClickListener {
    /* SD卡根目录 */
    private File rootDie;
    /* 输出文件名称 */
    private String outFileName = "ldm.rar";
    /* 进度条对话框 */
    private ProgressDialog pdialog;
    
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    checkAndCreateDir();
    findViewById(R.id.file_download_btn).setOnClickListener(this);
    }
    
    
    @Override
    protected Dialog onCreateDialog(int id) {
    /* 实例化进度条对话框 */
    pdialog = new ProgressDialog(this);
    /* 进度条对话框属性设置 */
    pdialog.setMessage("正在下载中...");
    /* 进度值最大100 */
    pdialog.setMax(100);
    /* 水平风格进度条 */
    pdialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
    /* 无限循环模式 */
    pdialog.setIndeterminate(false);
    /* 可取消 */
    pdialog.setCancelable(true);
    /* 显示对话框 */
    pdialog.show();
    return pdialog;
    }
    
    
    /* 检查sdcard并创建目录文件 */
    private void checkAndCreateDir() {
    /* 获取sdcard目录 */
    rootDie = Environment.getExternalStorageDirectory();
    /* 新文件的目录 */
    File newFile = new File(rootDie + "/download/");
    if (!newFile.exists()) {
    /* 如果文件不存在就创建目录 */
    newFile.mkdirs();
    }
    }
    
    
    /* 异步任务,后台处理与更新UI */
    class MyLoadAsyncTask extends AsyncTask<String,String,String> {
    /* 后台线程 */
    @Override
    protected String doInBackground(String... params) {
    /* 所下载文件的URL */
    try {
    URL url = new URL(params[0]);
    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
    /* URL属性设置 */
    conn.setRequestMethod("GET");
    /* URL建立连接 */
    conn.connect();
    /* 下载文件的大小 */
    int fileOfLength = conn.getContentLength();
    /* 每次下载的大小与总下载的大小 */
    int totallength = 0;
    int length = 0;
    /* 输入流 */
    InputStream in = conn.getInputStream();
    /* 输出流 */
    FileOutputStream out = new FileOutputStream(new File(rootDie + "/mydownload1/",outFileName));
    /* 缓存模式,下载文件 */
    byte[] buff = new byte[1024 * 1024];
    while ((length = in.read(buff)) > 0) {
    totallength += length;
    String str1 = "" + (int) ((totallength * 100) / fileOfLength);
    publishProgress(str1);
    out.write(buff,length);
    }
    /* 关闭输入输出流 */
    in.close();
    out.flush();
    out.close();
    
    
    } catch (MalformedURLException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    return null;
    }
    
    
    /* 预处理UI线程 */
    @Override
    protected void onPreExecute() {
    showDialog(0);
    super.onPreExecute();
    }
    
    
    /* 结束时的UI线程 */
    @Override
    protected void onPostExecute(String result) {
    dismissDialog(0);
    super.onPostExecute(result);
    }
    
    
    /* 处理UI线程,会被多次调用,触发事件为publicProgress方法 */
    @Override
    protected void onProgressUpdate(String... values) {
    /* 进度显示 */
    pdialog.setProgress(Integer.parseInt(values[0]));
    }
    
    
    }
    
    
    @Override
    public void onClick(View v) {
    if (v.getId() == R.id.file_download_btn) {
    /* 异步下载 */
    new MyLoadAsyncTask().execute("http://192.168.1.105:8080/tool.rar");
    }
    }
    
    }

  • 最后别忘记在AndroidManifest.xml中加上权限:
    <!-- sdcard读写权限 -->
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
        <!-- sdcard创建目录与文件权限 -->
        <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
        <!-- 网络访问权限 -->
        <uses-permission android:name="android.permission.INTERNET" />

以上内容由PHP站长网【52php.cn】收集整理供大家参考研究

如果以上内容对您有帮助,欢迎收藏、点赞、推荐、分享。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读