看完这段话,其实觉得此书还是一个很不错的书,起码本节的第一段,就直入主题,看到这,我就知道了,其实异步请求就是我们需要的,都在主线程中做操作是不可取的,而且笔者也在强调不要去记20S这个数,他的意思就是,你优化的再好,也最好让其他线程来辅助完成耗时的操作。这也让我对这个异步任务很感兴趣,呵呵。
笔者谈到了4种解决UI组件更新的问题,因为在多线程中是不可以直接更新UI组件的,其中第一种Handler的处理方案,已经试过了,比较好用,其他三种笔者说不太好用,。。估计也就不试了,然后接下来看我们的AsyncTask。
使用注意:
每个AsyncTask只能被执行一次,这个可一定记好了。。 哈。
public class MainActivity extends Activity {
private TextView show;
// 1.必须在UI主线程中创建AsyncTask的实例
// 这三个参数:
// 1)入参:URL类型的参数 在UI主线程中 excute传入的参数
// 2)进度条:参数是Integer 整数的
// 3)返回值:返回值为String
class MyAsyncTask extends AsyncTask<URL, Integer, String>{
Context mContext; //获取主UI的上下文句柄, 这样方便更改UI组件状态
ProgressDialog pdialog; //进度条
StringBuffer sb = new StringBuffer();
int hasread = 0;
public MyAsyncTask(Context context){
this .mContext = context;
}
/**
* 当启动此线程之前 执行此方法 ,,也就是一些预处理的方法
*/
@Override
protected void onPreExecute() {
//初始化进度条
pdialog = new ProgressDialog(mContext );
pdialog.setCancelable( false );//没有取消按钮
pdialog.setTitle( "正在读取..." );
pdialog.setMessage( "稍等。。。" );
pdialog.setMax(200);
pdialog.setProgressStyle(ProgressDialog. STYLE_HORIZONTAL );//设置样式
pdialog.setIndeterminate( false );//是否显示进度条
pdialog.show(); //显示进度条
}
/**
* 完成的后执行的方法,这里的参数 是有后台的主要处理方法doInBackground传过来的
*/
@Override
protected void onPostExecute(String result) {
show.setText(result);
pdialog.dismiss();
}
/**
* 进度更新时候,调用的方法,这里边的values 是由doInBackGround方法 调用pulishProgress传过来的。
*/
@Override
protected void onProgressUpdate(Integer... values) {
show.setText( "已经读取了" + values[0] + "行了..." );
pdialog.setProgress(values[0]); //更新进度条
}
/**
* 这就是完成工作最多的方法,它几乎完成了大部分的实际工作。
*/
@Override
protected String doInBackground(URL... paramArrayOfParams) {
try {
URLConnection conn = paramArrayOfParams[0].openConnection();//获取传来的参数
BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line = null ;
while ((line = br.readLine())!= null ) {
sb.append(line);
hasread++;
publishProgress( hasread);
}
return sb .toString();
} catch (IOException e) {
e.printStackTrace();
}
return null ;
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout. activity_main);
//获取TextView组件
show = (TextView)findViewById(R.id.show );
}
public void holdbtnClick(View source){
//2.在UI主线程中调用excute 方法
MyAsyncTask mt = new MyAsyncTask(this );
try {
mt.execute( new URL("http://www.myt360.com" ));
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
}
xml:
< LinearLayout xmlns:android ="http://schemas.android.com/apk/res/android"
android:id= "@+id/ll"
android:layout_width= "match_parent"
android:layout_height= "match_parent"
android:orientation= "vertical" >
<TextView
android:id ="@+id/show"
android:layout_width ="match_parent"
android:layout_height ="400dp"
android:layout_gravity ="center"
/>
<Button
android:id ="@+id/holdbtn"
android:layout_width ="wrap_content"
android:layout_height ="wrap_content"
android:onClick ="holdbtnClick"
android:text = "获取"/>
</ LinearLayout>