1. 程式人生 > >Android學習筆記10-Service後臺服務(1)

Android學習筆記10-Service後臺服務(1)

Android學習筆記10-Service後臺服務(一)-Android 多執行緒程式設計

1,Service簡介

Service時Android程式中的四大元件之一,它和Activity都是Context的子類,只不過Service沒有UI介面,是在後臺執行的元件。

Service是Android平臺中實現程式後臺執行的解決方案,非常適合去執行那些不需要和使用者互動而且還要長期執行的任務,服務的執行不依賴於任何介面,即使程式被切換到後臺。或者使用者打開了其他的程式,服務依然能夠保持正常的執行。

注意:

  • 服務依賴於建立服務時所在的應用程式程序,不是執行在一個獨立的程序中。
  • 當一個應用程式被殺掉時,依賴於該程式的服務也會停止執行。
  • 服務並不會自動開啟執行緒,所有的程式碼都是預設執行在主執行緒中,也就是我們需要在服務的內部手動建立子執行緒,並在這裡執行具體的任務。

2,Android多執行緒程式設計

在Android程式中,當我們需要執行一些比較耗時的操作,比如發起一條網路請求,考慮到網路可能比較滿的原因,伺服器可能不會立刻響應我們的請求,如果不將這些操作放到子執行緒中執行,就會導致主執行緒堵塞。

2.1執行緒的基本使用方法

1, 第一種方式

然後通過new MyThread.start().啟動,這樣程式碼就會在子執行緒中運行了。

2,第二種啟動方式 ,通過繼承Runnable介面的方式定義一個執行緒。

然後通過啟動。
3,第三種方式

2.2在子執行緒中更新UI

在Android中,UI是屬於執行緒不安全的,如果想更新UI元素,必須在主執行緒中更新。
下面舉一個在子執行緒中更新UI的DEMO。
activity_main.xml 佈局檔案

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width
="match_parent" android:layout_height="match_parent">
<Button android:id="@+id/change_text" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Change text" /> <TextView android:id="@+id/text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:text="hello world" android:textSize="20sp" /> </RelativeLayout>

定義了兩個控制元件,一個button,一個TextView,我們要實現當點選button的時候,改變TextView的顯示內容。

在點選事件的函式中,定義一個子執行緒進行UI操作,執行一下程式會發現崩潰。

所以,在Android中不允許在子執行緒中對UI進行操作

Android中提供了一套非同步訊息處理機制,完美的解決了在子執行緒中進行UI操作的問題.

package com.example.chen.androidthread;

import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private TextView text;
    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操作
                    text.setText("Nice to meet you");
                    break;
                default:break;
            }
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //宣告控制元件
        Button changeText = (Button) findViewById(R.id.change_text);
        text = (TextView) findViewById(R.id.text);
        //設定點選監聽器
        changeText.setOnClickListener(this);
    }

    /**
     * 設定點選事件
     */
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.change_text:
                Message message = new Message();
                message.what = UPDATE_TEXT;
                handler.sendMessage(message);
                break;
            default:break;
        }
    }
}

在這裡,我們並沒有在子執行緒中更新UI,而是建立了一個Message(android.os.Message) 物件,通過設定message的what為指定值UPDATE_TEXT.然後通過handler的sendMessage() 方法將message傳送出去。
在Handler類中,在重寫的handleMessage(Message msg) 方法中,會接受sendMessage()方法傳送來的message物件。接著,對message的what值進行判斷,如果是UPDATE_TEXT,就會執行更新UI的操作。

點選button

在這個demo中,我們熟悉了Android非同步處理訊息的基本方法,在下篇文章中,我們來來了解了解Android非同步處理訊息的工作機制