前面几篇文章介绍了Android中常用的http框架:volley,所谓框架者无非就是对我们所需的一系列操作进行了封装,简化了我们的工作。
但万变不离其宗,我们还是需要掌握Android原生的网络操作类,所以这篇文章主要介绍这两个类,
HTTPUrlConnection
HTTPClient
,以及常需要用到的AsyncTask
.本文代码github地址:UseAsyncTask
一个UrlConnection常用来通过网络发送和获取数据,数据可以使任何类型任何长度,HttpUrlConnection通常用于发送和接收长度未知的流数据;
使用HttpUrlConnection的一个简单示例:从远程获取图片并显示在ImageView中
ImageView imageView=(ImageView).findViewById(R.id.imageview);
URL url=new URL(http://www.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的基本用法,还有些需要掌握的主题:
Android 官方在API 22之后已经弃用,尽量使用HttpUrlConnection
AsyncTask是实现异步操作的一种机制,我们常常需要更新UI,但主线程不能执行耗时操作,否则会引发错误;AsyncTask用于执行后台操作,无需手动处理线程的创建和执行;它常用来处理一些短时操作,如果长时间操作考虑使用Service
AsyncTask的使用:
创建一个Task:我们需要创建一个Task继承自AsyncTask,
Tips:可以看到AsyncTask中的四个方法只有doInBackground()实在后台线程中运行的,因此在它里面执行一些耗时操作,而其它方法运行在UI线程,执行更新UI视图等操作。
综合以上我们来做个练习:
UseAsyncTask
在Manifest.xml
中添加联网权限
创建布局,我们这里用来显示一张电影图片,
<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">
<TextView
android:text="豆瓣电影Top10"
android:background="#1C9439"
android:textSize="24sp"
android:textColor="#fff"
android:layout_marginTop="5dp"
android:layout_marginBottom="10dp"
android:gravity="center"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<ImageView
android:id="@+id/movie_image"
android:layout_gravity="center"
android:background="#ffcc"
android:layout_margin="3dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
MainActivity
public class MainActivity extends ActionBarActivity {
private ImageView imageView;
//图片地址
private final String url="http://www.jycoder.com/json/movies/2.jpg";
//显示进度
private ProgressDialog pDialog;
@Override
protected 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);
//执行Task
new ImageDownloadTask().execute(url);
}
public class ImageDownloadTask extends AsyncTask<String,Integer,Bitmap>{
@Override
protected void onPreExecute() {
super.onPreExecute();
pDialog.show();
}
@Override
protected 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;
}
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
pDialog.setProgress(values[0]);
}
@Override
protected void onPostExecute(Bitmap bitmap) {
if(pDialog!=null)
pDialog.dismiss();
pDialog = null;
//将Bitmap填充进Imageview
imageView.setImageBitmap(bitmap);
}
}
}
这部分内容很简单吧~,其实这部分难的就是我们需要理解UI线程,以及了解AsyncTask与Service的适用场景。
参考资料:Android AsyncTask
个人主页: 明桑战胜Android汪的黑历史
Android网络编程 HttpUrlConnection HttpClient AsyncTask
原文地址:http://blog.csdn.net/qwm8777411/article/details/45845907