项目经常需要使用线程Thread、计时器,计时器有Timer()普通定时器、AlarmManager全局定时器,线程分同步和异步;
Andriod提供了Handler 和 Looper 来满足线程间的通信。Handler先进先出原则。Looper类用来管理特定线程内对象之间的消息交换。
1)Looper: 一个线程可以产生一个Looper对象,由它来管理此线程里的MessageQueue(消息队列)。
2)Handler: 你可以构造Handler对象来与Looper沟通,以便push新消息到MessageQueue里;或者接收Looper从Message Queue取出)所送来的消息。
3) Message Queue(消息队列):用来存放线程放入的消息。
4)线程:UIthread 通常就是main thread,而Android启动程序时会替它建立一个MessageQueue。
然后针对使用线程时经常碰到几个问题:耗时操作造成UI卡顿、Thread.sleep()延时超过5秒以上容易造成ANR 、子线程无法更新UI…改善方法:
1.耗时操作需要开启子线程,判断当前主线程或子线程:Thread.currentThread().getName();
new Thread(){//开启子线程
@Override
public void run() {
super.run();
try {
URL url = new URL(Constant.VOLLEY.AWARDURL);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setConnectTimeout(5000);
connection.setReadTimeout(5000);
connection.connect();
} catch (MalformedURLException e1) {
} catch (IOException e) {
HomeActivity.this.runOnUiThread(new Runnable() {//runOnUiThread进行UI更新操作
@Override
public void run() {
Toast.makeText(HomeActivity.this, "网络异常,请检查网络", Toast.LENGTH_SHORT).show();
}
});
}
}
}.start();
2.Thread.sleep()阻塞休眠替换成postDelayed
Handler hand=new Handler();
hand.postDelayed(new Runnable() {
@Override
public void run() {
//每隔1000毫秒需要延时重复操作
hand.postDelayed(this, 1000);
}
},10);//第一次开启时等待10毫秒
3.使用AsyncTask异步线程
TextView textview;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_welcme);
textview=(TextView)findViewById(R.id.textview);
MyAsyncTask myAsyncTask = new MyAsyncTask();
myAsyncTask.execute("www.xx.com");
}
class MyAsyncTask extends AsyncTask<String, String, String>{
@Override
protected String doInBackground(String... params) {
// 耗时操作
return "耗时操作";
}
@Override
protected void onPostExecute(String result) {
// 可进行更新UI等子线程无法实现的操作
textview.setText(result);
super.onPostExecute(result);
}
}