android下载学习和handler

这几天一直在学习android使用Asynctast(HttpURLConnection),DownLoadManager进行下载。

1.HttpURLConnection:这种方式使用了java jdk网络编程原理,实际上只是建立了一个与服务器的tcp连接,并没有实际发送http请求,无论是post还是get,http请求实际上直到HttpURLConnection的getInputStream()这个函数里面才正式发送出去。在用POST方式发送URL请求时,URL请求参数的设定顺序是重中之重,对connection对象的一切配置(那一堆set函数)都必须要在connect()函数执行之前完成。而对outputStream的写操作,又必须要在inputStream的读操作之前。这些顺序实际上是由http请求的格式决定的。

通过设置点击事件启动一个new MyAsyncTask().execute(FILE_PATH);然后

public class MyAsyncTask extends AsyncTask<String, Integer, byte[]> {
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
   //启动之前的设置
        }


        @Override
        protected byte[] doInBackground(String... params) {
            //    通过Apache的HttpClient来访问请求网络中的一张图片
           
return image;//返回数据的byte
        }


        @Override
        protected void onProgressUpdate(Integer... values) {
            super.onProgressUpdate(values);
            //    更新ProgressDialog的进度条
            progressDialog.setProgress(values[0]);//因为上面返回了一个byte数组,系统类对其进行了封装转为int数组
        }


// 下载完在此处进行操作
        @Override
        protected void onPostExecute(byte[] result) {
            super.onPostExecute(result);
            //    将doInBackground方法返回的byte[]解码成要给Bitmap
            Bitmap bitmap = BitmapFactory.decodeByteArray(result, 0, result.length);
            //    更新我们的ImageView控件
            imageView.setImageBitmap(bitmap);//如果下载的是图片
            //    使ProgressDialog框消失
            progressDialog.dismiss();
            progressDialog.setProgress(0);
        }
    }

2.DownLoadManager:刚开始一直不知道怎么使用这个方法去进行回调,对进度条进行操作,后面自己找资料(百度、书),终于实现了

 downloadObserver = new DownloadChangeObserver(null);
 getContentResolver().registerContentObserver(CONTENT_URI, true, downloadObserver);//这里的两句是在onCreate这个方法里面写的,

上面的这个方法我查了资料,说是接口监视数据的变更,我的理解就是通过这个来监视数据的变化,通过DownloadChangeObserver里面的方法进行回调。


然后点击下载的时候发handler,在handler中downId = downManager.enqueue(request);然后在回调方法中对数据进行查找,将数据的变化set进progressbar,通过这几天的学习,对handler的理解有加深了 一步。

不难看出,handler是主线程上一个串通的消息机制,主线程中可以通过开启子线程做复杂的操作,当操作完成后,发送handler消息,当handler捕获到的时候,通过这个消息的类型进行相应的操作,因为handler是和主线程绑定的,那么在handler中就可以Toast显示一些消息,并且能够对ui进行简单的操作,如果在子线程中对ui进行操作,会报错的。

哪里有什么问题,希望大家指出。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值