了解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();

 

服务的基本用法:

  定义一个服务:

    

posted @ 2017-03-11 16:06  lcOPM  阅读(155)  评论(0)    收藏  举报