Android中Handler使用实例
16lz
2021-01-24
本文通过“使用新线程计算质数”这样一个demo,简单讲解如何在Android中使用Handler进行多线程开发。
为了更好地理解Handler的工作原理,先介绍一下Handler一起工作的几个组件。
- Message:Handler接收和处理的消息对象
- Looper:每个线程只能拥有一个Looper。它的loop方法负责读取MessageQueue中的消息,读到消息之后就把消息交给发送该消息的Handler进行处理。
- MessageQueue:消息队列。程序创建Looper对象时,会在它的构造器中创建MessageQueue对象。
在线程中使用Handler的步骤如下:
- 调用Looper的prepare()方法为当前线程创建Looper对象。
- 有了Looper之后,创建Handler子类的实例,重写handleMessage方法。在本实例中该方法用来处理计算质数的逻辑。
- 调用Looper的loop()方法启动Looper。
java代码
public class MainActivity extends Activity { private EditText editText; private TextView numText; private CalThread calThread; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); editText = (EditText) findViewById(R.id.editText); calThread = new CalThread(); //启动线程 calThread.start(); } /** * 点击事件 * * @param view */ public void cal(View view) { int num = Integer.parseInt(editText.getText().toString()); Log.e("NUM", num + ""); Bundle bundle = new Bundle(); bundle.putInt("upper", num); //创建消息 Message message = new Message(); message.what = 123123; message.setData(bundle); //发送消息 calThread.handler.sendMessage(message); } /** *创建一个新线程 **/ class CalThread extends Thread { public Handler handler; public void run() { //创建Looper Looper.prepare(); //实例化Handler并重写handleMessage方法 handler = new Handler() { @Override public void handleMessage(Message msg) { if (msg.what == 123123) { int upperNum = msg.getData().getInt("upper"); List numList = new ArrayList(); outer: for (int i = 2; i < upperNum; i++) { for (int j = 2; j < Math.sqrt(i); j++) { if (i % j == 0) { continue outer; } } numList.add(i); } Toast.makeText(MainActivity.this, numList.toString(), Toast.LENGTH_SHORT).show(); } } }; //启动Looper Looper.loop(); } }}
xml代码
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/editText" android:layout_alignParentTop="true" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="计算所有质数" android:id="@+id/button" android:onClick="cal" android:layout_alignParentTop="true" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:layout_marginTop="63dp" />RelativeLayout>
更多相关文章
- Android知识体系总结之Android部分之Toast篇
- Android(安卓)9.0 源码_机制篇 -- 全面解析 Handler 机制(原理篇)
- 浅谈Android(安卓)Handler 消息机制
- Android(安卓)远程图片获取和本地缓存(一)
- Android:(13)Intent消息传递
- HandlerThread
- Android通过Service编程实现短信监听,通过Toast显示收到的短信的
- Android中的消息机制(Handler)
- Android消息机制(六) 总结