Android 開發Part3

前一篇Part2

Part3的內容 – asynchronous task, view inflation, file I/O.

AsyncTask

為了不影響介面反應, 長時間執行事件需要在背景執行, 利用AsyncTask是不錯的方法。

先看一下官方文件, 這裡最重要的就是泛型宣告, 三個泛型分別用在執行, 進度, 完成三個不同的事件處理器. 這裡要先了解一下AsyncTask的生命週期. 在AsyncTask裡啟動後, 首先會執行doInBackground, 這就是背景方法, 長時間事項要在這個handler裡面進行, 系統會安排背景執行緒去處理. 過程中onProgressUpdate會被呼叫, 用來通知UI事件還在處理中, 這個方法可以不實作. 最後在doInBackground完成後, onPostExecute會被呼叫, 這方法通常是用來把結果顯示於介面. onProgressUpdate和onPostExecute都是介面執行緒負責, 所以可以用來更新介面.

有這個了解之後, 就可以回到泛型, 第一個是doInBackground的參數陣列物件的型別, 第二個是onProgressUpdate的, 第三個是doInBackground傳給onPostExecute的運作結果, 所以doInBackground的return type會跟onPostExecute的參數相同.

這就是AsyncTask的主要功能, 接下來看幾段sample code

MainActivity.cs 產生並啟動AsyncTask

MyAsyncTask task = new MyAsyncTask(this);

task.execute(“Hello”, “World”);

MyAsyncTask.cs定義MyAsyncTask

Public class MyAsyncTask extends AsyncTask<String, Void, String>

{

//skip constructor def

@Override

protected String doInBackground(String… params)

{

String hello = params[0];

String world = params[1];

return hello + “ “ + world;

}

@Override

protected void onPostExecute(String result)

{

TextView view = mainActivity.findViewById(R.Id.mytextview);

view.SetText(result);

}

}

這兩段程式, 首先mainActivity會建立並呼叫MyAsyncTask, 在constructor把自己傳給MyAsyncTask, 讓task可以更新介面, 並給兩個字串參數. MyAsyncTask把兩個參數組合並把結果顯示在一個TextView.

資料綁定Inflation

Android把資料綁定稱為inflation, 資料綁定就是把資料利用指定的介面模版, 是應用程式常見的概念. Android把模版看成是氣球, 把資料吹進去成型, 是很貼切的稱呼.下面是一個最精簡的sample

MyActivity.cs

public class MyActivity extends Activity

{

ArrayAdapter<String> adapter = new ArrayAdapter<String> (this, android.R.layout.simple_spinner_item, new String[] {“water”,“coffee”, “tea”});

Spinner s = findViewById(R.Id.spinner1);

s.setAdapter(adapter);

}

這個程式碼會把三個字串送進一個spinner, spinner是類似下拉式選單的元件.

Inflation其實需要三種物件互相配合, View, Data, Adapter, View負責顯示, Data記錄內容, Adapter就是負責把Data轉成View可以使用的介接器. 這個例子使用Android內建的ArrayAdapter介接, 配合R.layout.simple_spinner_item為Spinner的每一個row的模版. 下一次我會介紹如何使用自訂layout和自建Adaptor.

File I/O

Android有很多種資料儲存方式, 例如SQLite和Preference, 這裡先介紹File I/O.

寫入檔案

FileOutputStream fs = myActivity.openFileOutput(filename, Content.MODE_PRIVATE);

OutputStreamWriter fwrite = new OutputStreamWriter(fs);

fwrite.write(“hello world”);

fs.close();

利用openFileOutput新增一個名為filename的檔案, 並且把Access Control設定為PRIVATE, 內建還有好幾種Access權限, 按需求而選. 寫入字串後關閉.

讀取檔案, 基本上跟寫入相反就可以

InputStream fs = openFileInput(filename);

InputStreamReader fread = new InputStreamReader(fs);

BufferedReader freadBuffered = new BufferedReader(fread);

StringBuffer bffr = new StringBuffer();

String temp = null;

while((temp = freadBuffered.readLine()) != null)

{ bffr.append(temp+”\n”); }

fs.close();

Part 4會介紹如何把Part1~3的功能合起來使用, 例如使用Listener管理AsyncTask的結果, Inflate自訂Layout等

Leave a Reply

Please log in using one of these methods to post your comment:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s