1.什么是线程的阻塞
2.什么是异步操作
3.AsyncTask的基本使用方法
1.新建一个NetOperator的类,代码如下:
package weo.cao.test;
//模仿访问网络的操作
public class NetOperator {
public void operate()
{
try {
Thread.sleep(5*1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
2.新建一个MainActivity的类
package weo.cao.test;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class MainActivity extends Activity {
private Button netOperatorButton=null;
private Button printButton=null;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
netOperatorButton=(Button)this.findViewById(R.id.netOperatorButtonId);
printButton=(Button)this.findViewById(R.id.printButtonId);
netOperatorButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
NetOperator newOperator=new NetOperator();
newOperator.operate();
//FirstAsyncTask asyncTask=new FirstAsyncTask();
//asyncTask.execute();//注意不是直接调用doInBackground()方法,否则没有开始一个新的线程,还是在和主线程中,会自动调用doInBackground()方法
////asyncTask.doInBackground();
}
});
printButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
System.out.println("输出信息");
}
});
}
}
执行结果如下:
先单击第一个按钮,再双击,出现上图的结果(单击第一个按钮后迅速单击第二个按钮,由于线程对象睡眠一秒,会过一秒才出现输出信息,而不是立即出现输出信息,这就造成了线程阻塞),为了解决这个问题,新建一个FirstAsyncTask的类,代码如下:
package weo.cao.test;
import android.os.AsyncTask;
public class FirstAsyncTask extends AsyncTask<Object, Object, Object> {
@Override
protected Object doInBackground(Object... params) {
// TODO Auto-generated method stub
NetOperator newOperator=new NetOperator();
newOperator.operate();
return null;
}
}
并将上面MainActivity类中中间注释的部分取消,再运行程序,无论你什么时候单击第二个按钮都会立即出现输出信息