Java/Android 线程 postDelayed/runOnUiThread/AsyncTask

博客探讨了在Android开发中如何处理线程和计时器,特别是UI线程与后台线程的交互。讲解了Looper、Handler和Message Queue的角色,并指出在处理耗时操作时避免UI卡顿和ANR问题的方法,如使用postDelayed、runOnUiThread以及AsyncTask。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

项目经常需要使用线程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);
}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值