多线程android代码,android入门 — 多线程(一)(示例代码)

本文介绍了如何在Android应用中避免主线程阻塞导致的ANR问题,通过使用子线程和Handler机制处理网络请求及UI操作。讲解了为何UI线程修改UI组件的必要性,以及如何通过Handler确保线程间的正确通信和UI组件的同步更新。

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

03c5808a8b069f4cf3b5539effb0fcbc.png

android中的一些耗时操作,例如网络请求,如果不能及时响应,就会导致主线程被阻塞,出现ANR,非常影响用户体验,所以一些耗时的操作,我们会想办法放在子线程中去完成。

android的UI操作并不是线程安全的,所以多个线程并发操作UI组件的时候,则可能导致线程安全问题。为了解决这个问题,android只允许UI线程修改UI组件。

public class MainActivity extends AppCompatActivity

{

TextView textView;

Button changeText;

@Override

protected void onCreate(Bundle savedInstanceState)

{

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

changeText = (Button)findViewById(R.id.btn);

textView = (TextView)findViewById(R.id.textView);

changeText.setOnClickListener(this);

}

public void change(View view)

{

switch (view.getId())

{

case R.id.btn:

new Thread(new Runnable() {

@Override

public void run() {

textView.setText("被改变了");

}

}).start();

break;

default:

break;

}

}

}

在xml中定义了一个按钮和一个TextView,当点击按钮的时候,开启子线程去更改TextView中的文字,但是在编译的时候是无法通过的,因为不允许在子线程中直接对UI线程中组件进行操作。

需要借用Handler来实现子线程更新UI组件的功能。

public class MainActivity extends AppCompatActivity

{

private TextView textView;

private Handler handler = new Handler()

{

//接收的是消息队列中的msg

public void handleMessage(Message msg)

{

switch (msg.what)

{

case 0x0001:

int index = msg.arg1;

textView.setText(index + "");

break;

}

}

};

@Override

protected void onCreate(Bundle savedInstanceState)

{

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

textView = (TextView)findViewById(R.id.textView1);

}

public void changeNumber(View view)

{

switch (view.getId())

{

case R.id.btn:

new Thread()

{

public void run()

{

for(int i = 0; i < 10; i++)

{

Message msg = new Message();

//msg.what是必不可少的,需要用来做判定

msg.what = 0x0001;

msg.arg1 = i;

handler.sendMessage(msg);

try {

Thread.sleep(1000);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

}.start();

break;

}

}

}

MessageQueue消息队列

android采用的是MessageQueue机制保证线程间通信。

MessageQueue是一个消息队列,用来存放通过Handler发布的消息,Android在第一次启动程序的时候会默认为UI线程创建一个关联的消息队列,用来管理程序的组件,如Activity、BroadcastReceiver、Service等。

Handler消息传递机制

工作线程通过handler对象和主线程进行通信

Handler对象所有工作都在主线程中执行

Handler类需要实现handleMessage()方法,来处理消息队列中取出的Message对象

handleMessage()方法由主线程调用,可以在需要的时候更新UI线程,但是必须确保此方法快速完成,因为其他的UI操作会等待它完成才能执行

6bbc6049e7b7af4a885702d120826e75.png

62c87596e820e462ba59103e927c9037.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值