了解Android核心:Looper,Handler和HandlerThread

Natalie ·
更新时间:2024-11-10
· 564 次阅读

 

Android中的主线程由 looper 和 Handlers 组成。所以了解创建无阻碍的响应式 UI 很重要。

MessageQueue 是一个队列,其中包含消息任务。 Handler 在 MessageQueue 中以任务形式排队,Looper 在任务出现时执行它们 MessageQueue. Looper 使线程保持活动状态,循环 MessageQueue 并向相应 Handler 的进程发送消息。 Thread 通过调用 Looper 的 quit() 方法终止。 Handler 及其组件 Handler:框架的重要对象,它具有双重责任。它绑定到给定线程的特定 Looper,并提供了将消息发送到相关 MessageQueue 的方法。该处理器还负责在实际执行消息的内容。 Message:封装有关在特定线程上执行的操作信息。 Runnable:抽象一个线程可以执行的任何操作的接口。 MessageQueue:表示线程消耗的消息队列。 Looper:负责循环的对象,循环检查 MessageQueue 以查看是否有消息要运行并将其发送到特定的 Handler。每个线程只能有一个 Looper。

现在,开始编写代码了。

例子1: 使用 Thread:

创建主线程处理程序

Handler handler = new Handler(Looper.getMainLooper()); thread = new Thread(new Runnable() { @Override public void run() { handler2 = new Handler(Looper.getMainLooper()); handler2.post(new Runnable() { @Override public void run() { Toast.makeText(MainActivity.this,"hello world",Toast.LENGTH_SHORT).show(); } }); } }); 使用 HandlerThread: handlerThread = new HandlerThread("name"); handlerThread.start(); handler = new Handler(handlerThread.getLooper()); handler.post(new Runnable() { @Override public void run() { Toast.makeText(MainActivity.this,"世界你好",Toast.LENGTH_SHORT).show(); } });

注意:使用完 HandlerThread 后,要调用 quit() 方法退出。

例子2: 进度条

MainActivity.java public class MainActivity extends AppCompatActivity { Handler handler; Thread thread; Button botton; int MAX = 100; TextView textView; HandlerThread handlerThread; ProgressBar progressBar; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); initThread(); } private void initView(){ botton = (Button)findViewById(R.id.start_progress); progressBar = (ProgressBar)findViewById(R.id.progressBar); textView = (TextView)findViewById(R.id.textView); progressBar.setMax(MAX); } private void initThread(){ handler = new Handler(){ @Override public void handleMessage(Message message){ super.handleMessage(message); textView.setText(message.what+""); } }; thread = new Thread(new Runnable() { @Override public void run() { for (int i=0;i<100;i++){ progressBar.setProgress(i); try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } Message msg = new Message(); msg.what = i; msg.obj = "obj"; handler.sendMessage(msg); } } }); } public void onClick(View view){ switch (view.getId()){ case R.id.start_progress: thread.start(); break; default: break; } } public void onDestroy(){ super.onDestroy(); handlerThread.quit(); } } activity_main.xml
需要 登录 后方可回复, 如果你还没有账号请 注册新账号