您的位置:首页 > 移动开发 > Android开发

android学习_AsyncTask(异步任务)

2013-10-31 20:38 567 查看


看完这段话,其实觉得此书还是一个很不错的书,起码本节的第一段,就直入主题,看到这,我就知道了,其实异步请求就是我们需要的,都在主线程中做操作是不可取的,而且笔者也在强调不要去记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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息