android下载学习和handler

来源:互联网 发布:手机修图软件 编辑:程序博客网 时间:2024/06/04 01:33

这几天一直在学习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
原创粉丝点击