最近补充了点的android网络知识,来自于极客学院,自己怕忘便整理了下当作自己的笔记用。
我们知道如果线程执行时很容易出现假死状况(加载时间过长),android使用了AsyncTask这个类来解决这个问题
下面是实例:
package com.example.usingasynctask;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends ActionBarActivity {
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = (TextView) findViewById(R.id.textView);
findViewById(R.id.btn_asyncTask).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
readURL("http://www.csdn.net/");
}
});
}
public void readURL(String url){
//创建一个匿名的AsyncTask实例
new AsyncTask<String, Float, String>() { //<Params, Progress, Result> 三个参数分别是输入的类型,处理过程中返回值的类型,和返回结果的数据类型
@Override
//类似于线程中的run方法,也就是执行后台的操作
protected String doInBackground(String... params) { //这里的参数就是传入的初始值
try {
URL url = new URL(params[0]);
URLConnection urlConnection = url.openConnection();//创建连接 并捕获try-catch
long total = urlConnection.getContentLength();//获取长度
InputStream is = urlConnection.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
//完成上面包装后来读取和存放数据
String line;
StringBuilder stringBuilder = new StringBuilder();
while((line = br.readLine()) != null){ //如果有数据,调用append方法传入line字符串
stringBuilder.append(line);
publishProgress((float)br.toString().length()/total);//获取执行进度的百分比
}
br.close();
isr.close();
return stringBuilder.toString();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
//添加回调方法
@Override
protected void onPreExecute() {
Toast.makeText(MainActivity.this, "开始读取", Toast.LENGTH_SHORT).show();
super.onPreExecute();
}
@Override
protected void onPostExecute(String result) {//此处的result是doInBackground的返回值stringBuilder.toString();
textView.setText(result);
super.onPostExecute(result);
}
@Override
protected void onProgressUpdate(Float... values) { //执行过程中对外发布执行的进度 ,void是上方自己指定的数据类型
System.err.println(values[0]);
super.onProgressUpdate(values);
}
/*
* UI互动操作这执行
*/
@Override
protected void onCancelled(String result) {
// TODO Auto-generated method stub
super.onCancelled(result);
}
@Override
protected void onCancelled() {
// TODO Auto-generated method stub
super.onCancelled();
}
}.execute(url); //url是上面传入的参数
}
}
下面是效果图,很直观的体现了异步加载,而且点击按钮是没有假死现象,实现了整个过程。