Android网络编程 HttpUrlConnection HttpClient AsyncTask

前面几篇文章介绍了Android中常用的http框架:volley,所谓框架者无非就是对我们所需的一系列操作进行了封装,简化了我们的工作。 但万变不离其宗,我们还是需要掌握Android原生的网络操作类,所以这篇文章主要介绍这两个类, HTTPUrlConnection HTTPClient,以及常需要用到的AsyncTask.

本文代码github地址:UseAsyncTask

1,HttpUrlConnection

一个UrlConnection常用来通过网络发送和获取数据,数据可以使任何类型任何长度,HttpUrlConnection通常用于发送和接收长度未知的流数据;

使用HttpUrlConnection的一个简单示例:从远程获取图片并显示在ImageView中

ImageView imageView=(ImageView).findViewById(R.id.imageview);URL url=new URL(.jycoder.com/json/movies/1.jpg);HttpUrlConnection conn= (HttpUrlConnection) url.openConnection();conn.connect();try{InputStream in=conn.getInputStream();//将获取到的图片显示在ImageView中Bitmap bitmap=BitmapFactory.decodeStream(in);imageView.setImageBitmap(BitmapFactory.decode(is));}finally{conn.disconnect();}

上面就是HttpUrlConnection的基本用法,,还有些需要掌握的主题:

Cookie和Cache:HttpUrlConnection拥有CookieManager和CookieHandler方法来设置Cookie,对于Cache提供了HttpResponseCache类;关于这部分参考资料:HttpUrlConnection HttpResponseCache2,HttpClient

Android 官方在API 22之后已经弃用,尽量使用HttpUrlConnection

3,AsyncTask

AsyncTask是实现异步操作的一种机制,我们常常需要更新UI,但主线程不能执行耗时操作,否则会引发错误;AsyncTask用于执行后台操作,无需手动处理线程的创建和执行;它常用来处理一些短时操作,如果长时间操作考虑使用Service

AsyncTask的使用:

创建一个Task:我们需要创建一个Task继承自AsyncTask,

AsyncTask中需要三个参数Params,Progress,Result: 我们还需要覆写AsyncTask中的四个方法:

Tips:可以看到AsyncTask中的四个方法只有doInBackground()实在后台线程中运行的,因此在它里面执行一些耗时操作,而其它方法运行在UI线程,执行更新UI视图等操作。

在主线程中执行Task:必须在主线程中实例化和执行AsyncTask,而且每个AsyncTask只执行一次取消一个Task:AsyncTask可以在任何时候通过调用cancel(true)取消。

综合以上我们来做个练习:

新建项目:UseAsyncTask

在Manifest.xml中添加联网权限

创建布局,我们这里用来显示一张电影图片,

==”match_parent”android:orientation=”vertical”><TextView=====”wrap_content”/><ImageView==>完成MainActivity ActionBarActivity {private ImageView imageView;String url=”http://www.jycoder.com/json/movies/2.jpg”;//显示进度private ProgressDialog pDialog;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//用来显示进度pDialog=new ProgressDialog(this);pDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);pDialog.setMessage(“Loading…”);pDialog.setMax(100);imageView= (ImageView) findViewById(R.id.movie_image);//执行Tasknew ImageDownloadTask().execute(url);} AsyncTask<String,Integer,Bitmap>{@Overrideprotected void onPreExecute() {super.onPreExecute();pDialog.show();}@Overrideprotected Bitmap doInBackground(String… urls) {HttpURLConnection connection = null;Bitmap bitmap=null;try {URL url=new URL(urls[0]);connection= (HttpURLConnection) url.openConnection();InputStream in= new BufferedInputStream(connection.getInputStream());bitmap= BitmapFactory.decodeStream(in);//获取文件流大小,用于更新进度int length=connection.getContentLength();int len=0,total_length=0,value=0;byte[] data=new byte[1024];while((len = in.read(data)) != -1){total_length += len;value = (int)((total_length/(float)length)*100);//调用update函数,更新进度publishProgress(value);}} catch (IOException e) {e.printStackTrace();}finally {if (connection!=null)connection.disconnect();}return bitmap;}@Overrideprotected void onProgressUpdate(Integer… values) {super.onProgressUpdate(values);pDialog.setProgress(values[0]);}@Overrideprotected void onPostExecute(Bitmap bitmap) {if(pDialog!=null)pDialog.dismiss();pDialog = null;//将Bitmap填充进ImageviewimageView.setImageBitmap(bitmap);}}} 总结:

这部分内容很简单吧~,其实这部分难的就是我们需要理解UI线程,以及了解AsyncTask与Service的适用场景。

参考资料:Android AsyncTask

微博:@明桑Android黑历史邮箱:<13141459344@163.com>

个人主页:明桑战胜Android汪的黑历史

接着我们去了遇龙河,那里的水清澈见底,我把脚伸进水里,

Android网络编程 HttpUrlConnection HttpClient AsyncTask

相关文章:

你感兴趣的文章:

标签云: