Handler子线程向主线程发送消息
1.由于在UI活动中不能进行耗时操作,因此不能再UIActivity中创建线程要不然会报错
2.Handler就是在Thread和UI主线程之间进行通讯的桥梁,线程的信息必须通过Handler来传递到UI主线程上(在代码中被注释的部分)
3.也可以直接用Handler来直接对UI主线程进行操作
4.操作的具体方法是 handler.sendEmptyMessage(TIME_DESC);发送一个空消息,然后Handler对这个消息进行处理
Handler主线程向子线程发送消息
1.新建一个类继承与Thread复写里面的run方法
2.在子线程中必须有Looper.prepare();和Looper.loop();这两个方法,(这两个方法在UI主线程中默认存在)并且将Handler的创建的对象和复写的方法都必须放到这两个方法之间,
3.启动线程,然后延时一会再发送信息(因为在启动线程的时候,会new一个Handler对象,这个是需要耗时操作的,如果不进行延时很有可能报空指针错误)
public class MainActivity extends AppCompatActivity {
private Button mBtnTime;
private Button mBtnSend;
private int count=60;
public static final int TIME_DESC=0x00;
private android.os.Handler handlerSend;
private android.os.Handler handler=new android.os.Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what){
case TIME_DESC:
// String time= (String) msg.obj;
count--;
mBtnTime.setText(count+"秒");
if (count>0){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
handler.sendEmptyMessage(TIME_DESC);
}
break;
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mBtnTime= (Button) findViewById(R.id.button_time_edsc);
mBtnTime.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//直接用Handler进行通讯
count=60;
handler.sendEmptyMessage(TIME_DESC);
//子线程向主线程发送消息
// new Thread(new Runnable() {
// @Override
// public void run() {
// while (count>0){
// try {
// Thread.sleep(1000);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
// count--;
// Message message=new Message();
// message.obj=count+"秒";
// message.what=TIME_DESC;
// handler.sendMessage(message);
// }
// }
// }).start();
}
});
mBtnSend= (Button) findViewById(R.id.button_send);
mBtnSend.setOnClickListener(new View.OnClickListener() {
//主线程向子线程发送消息
@Override
public void onClick(View v) {
MyThread myThread=new MyThread();
myThread.start();
//这里加延时的作用是因为MyThread中Handler要新创建一个对象,这个过程需要时间
//因此如果立刻发送消息就会报空指针的错误
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
handlerSend.sendEmptyMessage(0);
}
});
}
class MyThread extends Thread{
//接收主线程发送过来的消息
@Override
public void run() {
Looper.prepare();
handlerSend=new android.os.Handler(){
@Override
public void handleMessage(Message msg) {
Log.d("handler","接收到主线程发送过来的消息");
}
};
Looper.loop();
}
}
}
AsyncTask
1.AsyncTask是封装了Handler了方法,主要的方法有
2.doInBackground()相当于创建一个新的线程
3.onPostExecute,返回结果的方法
4.onProgressUpdate 中间过程处理的方法
public class MainActivity extends AppCompatActivity {
private Button mBtnStart;
private ProgressBar mProgressBar;
private int count=0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mBtnStart= (Button) findViewById(R.id.button_start);
mProgressBar= (ProgressBar) findViewById(R.id.progressbar);
mBtnStart.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
MyAsyncTask task=new MyAsyncTask();//创建一个新的AsyncTask对象
task.execute("执行"); //调用execut开始执行
}
});
}
class MyAsyncTask extends AsyncTask<String,Integer,String>{
/***
* 该方法是用于后台操作, 相当于新建一个线程进行操作
* @param params 传入的是String类型的参数
* @return 处理结束之后返回的一个String类型的结果,传入onPostExecute中
*/
@Override
protected String doInBackground(String... params) {
while (count<101){
count++;
publishProgress(count);
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return "已完成";
}
/***
* 接收doInBackground返回的结果
* @param s oInBackground返回的结果
*/
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
mBtnStart.setText(s); //在button上显示结果
}
/***
* oInBackground中间产生的变量,通过publishProgress传到该方法内,对其进行处理
* @param values
*/
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
int count=values[0];
mProgressBar.setProgress(count);//将count设置在progressbar上进行显示进度
}
}
}