了解Service
多线程编程:
线程的基本用法:
1.
class MyThread extends Thread{ @Override public void run() { //处理具体逻辑 } } new MyThread().start();
2.
class TwoThread implements Runnable { @Override public void run() { //处理具体逻辑 } } TwoThread twoThread = new TwoThread(); new Thread(twoThread).start();
3.
new Thread(new Runnable() { @Override public void run() { //处理具体逻辑 } }).start();
在子线程中更新UI:
1.创建Handler,用于接收和处理消息
public static final int UPDATE_TEXT = 1;//标记常量 private Handler handler = new Handler(){ @Override public void handleMessage(Message msg) { switch (msg.what){ case UPDATE_TEXT: //进行更新UI的操作 tv_main.setText("change text"); break; default: break; } } };
2.在子线程中发送消息
public void onClick(View v) { switch (v.getId()){ case R.id.bt_main: new Thread(new Runnable() { @Override public void run() { Message message = new Message(); message.what = UPDATE_TEXT; handler.sendMessage(message); } }).start(); break; default: break; } }
解析异步消息处理机制:
Message:在线程之间传递消息,可以携带少量的信息,用于在不同线程之间交换数据。
Handler:处理者的意思,主要是用于发送和处理消息的。发送消息一般是使用Handler的sendMessage()方法,而发出的消息经过一系列的处理后,最终会传递到Handler的handleMessage()方法中。
MessageQueue:消息队列,主要是用于存放所有通过Handler发送的消息。这部分消息会一直存在于消息队列中,等待被处理。每个线程中只会有一个MessageQueue对象。
Looper:MessageQueue的管家,调用Looper的loop()方法后,就会进入一个无限循环中,每当发现MessageQueue中存在一条消息,就会将它取出,并传递到Handler的handleMessage()方法中。每个线程只会有一个Looper对象。

使用AsyncTask:
class DownloadTask extends AsyncTask<Void,Integer,Boolean>{ @Override protected void onPreExecute() { //执行异步任务之前调用 } @Override protected Boolean doInBackground(Void... params) { try{ while(true){ //执行耗时操作,不能在这里更新UI int downloadPercent = 5;//获取需要更新的参数 publishProgress(5); if(downloadPercent >= 100){ break; } } }catch (Exception e ){ return false; } return true; } @Override protected void onProgressUpdate(Integer... values) { //执行publishProgress()后会调用此方法。在这里更新UI } @Override protected void onPostExecute(Boolean aBoolean) { //doInBackground()执行完后会调用此方法。处理返回的结果。 } } new DownloadTask().execute();
服务的基本用法:
定义一个服务:

浙公网安备 33010602011771号