編輯:關於Android編程
在簡易音樂播放器中,用了Handler,也沒有過多地去研究學習,這裡再學習下android下的異步消息處理機制。這裡用了Handler主要是在線程中不能更新UI,而需要通過Handler才可以。關於異步消息處理有幾個概念。
1、Message:消息,線程間通訊的數據單元。例如後台要下載歌曲然後下載完成要更新ui,則可以發送一條包含更新信息的Message給UI線程。
2、MessageQueue:消息隊列,用來存放所有通過Handler發布的消息,因為是隊列,所以是先進先出的。
3、Handler:Message的主要處理者,負責將Message添加到消息隊列以及對消息隊列中的Message進行處理。
4、Looper:循環管理MessageQueue,循環取出MessageQueue中的Message,並交給相應的Handler進行處理。
5、線程:UI thread是main thread,android啟動程序時會替他建立一個MessageQueue。每一個線程裡可含有一個Looper對象以及一個MessageQueue數據結構。
下面來個例子吧還是,新建工程HandlerTest,編寫簡單布局如下:
<!--{cke_protected}{C}%3C!%2D%2D%3Fxml%20version%3D%221.0%22%20encoding%3D%22utf-8%22%3F%2D%2D%3E-->
<linearlayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:layout_margin="10dp" tools:context="com.example.jared.handlertest.MainActivity">
<edittext android:id="@+id/inputContent" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="輸入要改變的內容"><button android:id="@+id/changeViewContent" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Change The ViewContent" android:textallcaps="false">
<textview android:id="@+id/testHandler" android:text="I am old!!!" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="20dp" android:textsize="22dip" android:layout_gravity="center">
</textview></button></edittext></linearlayout>
package com.example.jared.handlertest;
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.EditText;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
public static final int UPDATA_VIEW = 1;
private TextView textView;
private Button changeContent;
private EditText inputContent;
private Thread mThread;
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case UPDATA_VIEW:
String mInputContent = inputContent.getText().toString();
textView.setText(mInputContent);
break;
default:
break;
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = (TextView)findViewById(R.id.testHandler);
inputContent = (EditText)findViewById(R.id.inputContent);
changeContent = (Button)findViewById(R.id.changeViewContent);
changeContent.setOnClickListener(new myOnClickListener());
}
private class myOnClickListener implements View.OnClickListener {
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.changeViewContent:
mThread = new Thread(runnable);
mThread.start();
break;
default:
break;
}
}
}
Runnable runnable = new Runnable() {
@Override
public void run() {
Message message = new Message();
message.what = UPDATA_VIEW;
mHandler.sendMessage(message);
}
};
}

基本的Handler已經完成了,下面再學習下AsyncTask。
AsyncTask是方便編寫後台線程和UI線程的輔助類。它內部的實現是一個線程池,每個後台會提交到線程池中去執行。AsyncTask有三個模板函數:
1、Params:傳遞給後台任務的參數類型。
2、Progress:後台計算執行過程中,進步的單位類型。
3、Result:後台執行返回的結果的類型。
當標示不需要的類型的時候,只要用Void就行了。
AsyncTask需要重寫5個方法,分別是:
1、onPreExecute方法:准備運行,該回調函數在任務被執行之後立即由UI線程調用,一般可以顯示進度條。
2、doInBackground(Params ...)方法:正在後台運行,通常在這裡執行耗時的後台計算,計算結果返回給函數,這裡如果AsyncTask的第三個參數是Void的話不需要返回,這裡不能更新UI,但是可以調用publishProgress(Progress ...)方法完成。
3、onProgressUpdate(Progress ...)方法:進度更新,UI線程在publishProgress(Progress ...)方法調用完成後被調用,一般動態顯示一個進度。
4、onPostExecute(Result)方法:完成後台任務,會返回,這裡可以進行些UI的操作,比如提醒任務執行的結果,以及關閉掉進度條對話框等。
5、onCancelled方法:取消任務,在調用AsyncTask的cancel()方法的時候調用。
下面通過AsyncTask的方式來進行上面的例子,Handler的代碼就沒有刪除掉了,代碼如下:
package com.example.jared.handlertest;
import android.os.AsyncTask;
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.EditText;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
public static final int UPDATA_VIEW = 1;
private TextView textView;
private Button changeContent;
private EditText inputContent;
private Thread mThread;
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case UPDATA_VIEW:
String mInputContent = inputContent.getText().toString();
textView.setText(mInputContent);
break;
default:
break;
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = (TextView)findViewById(R.id.testHandler);
inputContent = (EditText)findViewById(R.id.inputContent);
changeContent = (Button)findViewById(R.id.changeViewContent);
changeContent.setOnClickListener(new myOnClickListener());
}
private class myOnClickListener implements View.OnClickListener {
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.changeViewContent:
// mThread = new Thread(runnable);
// mThread.start();
changeViewContentTask task = new changeViewContentTask();
task.execute();
break;
default:
break;
}
}
}
class changeViewContentTask extends AsyncTask {
@Override
protected Boolean doInBackground(Void... voids) {
return null;
}
@Override
protected void onProgressUpdate(Integer... values) {
}
@Override
protected void onPostExecute(Boolean b) {
String mInputContent = inputContent.getText().toString();
textView.setText(mInputContent);
}
@Override
protected void onPreExecute() {
}
@Override
protected void onCancelled() {
}
}
Runnable runnable = new Runnable() {
@Override
public void run() {
Message message = new Message();
message.what = UPDATA_VIEW;
mHandler.sendMessage(message);
}
};
}
這裡實例化一個task,然後task.execute();就可以執行了,效果如上就不添圖了。
Android中Adapter中edittext,checkbox記住狀態解決方案(二)
Android中Adapter中edittext,checkbox記住狀態解決方案(一) 在上篇文章解決了adapter中checkbox記住狀態和edittext可編
android小功能實現之文件讀寫
新建一個Android工程。 一 布局 先看效果圖: 打開main.xml修改內容如下:
Android Studio使用AndroidJUnitRunner進行單元測試
目前google是推薦使用AndroidJUnitRunner來進行單元測試的。 使用AndroidJUnitRunner進行測試的時候,需要做在b
Android控件之ScrollView用法實例分析
本文實例講述了Android控件之ScrollView用法。分享給大家供大家參考。具體如下:ScrollView滾動視圖是指當擁有很多內容,屏幕顯示不完時,需要通過滾動跳