android异步操作(AsyncTask)
public class MyAsyncTask extends AsyncTask<Void,Void,Void>{
//该方法不运行在UI线程中,不能对UI当中的控件进行设置和修改
@Override
protected Void doInBackground(Void... arg0){
//需要后台运行的代码
}
}
1 onPreExecute(doInBackground开始前运行)和onPostExecute(doInBackground结束后运行,调用doInBackground的返回值)的作用(运行在UI线程,doInBackgroud)。
2 publicProgress(在doInBackground运行的时候,发布一个更新,在方法doInBackground中使用,使用publicProgress去调用onProgressUpdate使UI线程进行更新)和onProgressUpdate的作用。
AsyncTask<param1,param2,param3>
param1:定义doInBackground的参数类型,execute()方法类型
param2:定义onProgressUpdate的参数类型
param3:定义doInbackground返回值类型和onPostExecute中的参数类型
操作流程:1 需要调用异步线程的类中声明。
//需要调用异步线程的类中MyAsyncTask asyncTask=new MyAsyncTask(...);
asyncTask.execute(...);//execute向doInBackground传递参数
2运行异步操作前,在UI线程中调用onPreExecute进行说明。
protected void onPreExecute(){//运行在调用异步操作之前
}
3 运行doInBackground,在doInBackground中调用publicProgress();
4 publicProgress()传递参数给onProgressUpdate()更新UI线程。。。。
5 异步操作结束,调用onPostExecute();
实例:
布局文件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
>
<Button
android:id="@+id/btn"
android:text="开始执行"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
<ProgressBar
android:id="@+id/progressBar"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
</LinearLayout>
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
>
<Button
android:id="@+id/btn"
android:text="开始执行"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
<ProgressBar
android:id="@+id/progressBar"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
</LinearLayout>
MyThread.java
public class MyThread {
public void operate(){
try{
Thread.sleep(1000);
}catch (Exception e){
e.printStackTrace();
}
}
}
public void operate(){
try{
Thread.sleep(1000);
}catch (Exception e){
e.printStackTrace();
}
}
}
MyAsyncTask.java
public class MyAsyncTask extends AsyncTask<Integer,Integer,String>{
Context context;
ProgressBar bar;
public MyAsyncTask(Context context, ProgressBar bar) {
this.context=context;
this.bar=bar;
}
//异步操作前执行
@Override
protected void onPreExecute()
{
Toast.makeText(context,"异步操作开始",Toast.LENGTH_LONG).show();
}
//异步操作
@Override
protected String doInBackground(Integer... integers) {
MyThread thread=new MyThread();
for(int i=10;i<=integers[0];i+=10){
thread.operate();
publishProgress(i);
}
return "异步操作结束";
}
@Override
protected void onProgressUpdate(Integer... integers){
bar.setProgress(integers[0]);
}
//异步操作后执行
protected void onPostExecute(String str){
Toast.makeText(context,str,Toast.LENGTH_LONG).show();
}
}
Context context;
ProgressBar bar;
public MyAsyncTask(Context context, ProgressBar bar) {
this.context=context;
this.bar=bar;
}
//异步操作前执行
@Override
protected void onPreExecute()
{
Toast.makeText(context,"异步操作开始",Toast.LENGTH_LONG).show();
}
//异步操作
@Override
protected String doInBackground(Integer... integers) {
MyThread thread=new MyThread();
for(int i=10;i<=integers[0];i+=10){
thread.operate();
publishProgress(i);
}
return "异步操作结束";
}
@Override
protected void onProgressUpdate(Integer... integers){
bar.setProgress(integers[0]);
}
//异步操作后执行
protected void onPostExecute(String str){
Toast.makeText(context,str,Toast.LENGTH_LONG).show();
}
}
MainActivity.java
public class MainActivity extends Activity implements View.OnClickListener {
Button btn=null;
ProgressBar bar=null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn=(Button)findViewById(R.id.btn);
bar=(ProgressBar)findViewById(R.id.progressBar);
btn.setOnClickListener(this);
}
@Override
public void onClick(View view) {
MyAsyncTask asyncTask=new MyAsyncTask(this,bar);
asyncTask.execute(100);
}
}
Button btn=null;
ProgressBar bar=null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn=(Button)findViewById(R.id.btn);
bar=(ProgressBar)findViewById(R.id.progressBar);
btn.setOnClickListener(this);
}
@Override
public void onClick(View view) {
MyAsyncTask asyncTask=new MyAsyncTask(this,bar);
asyncTask.execute(100);
}
}