編輯:中級開發
116. // myButton監聽器 這個按鈕用來 顯示和隱藏 值為"android小子"這個TextVIEw
117. public class MyButtonListener implements OnClickListener {
118. @Override
119. public void onClick(VIEw v) {
120. System.out.println("wo zhen de zhixing fou???");
121. //給靜態變量賦值
122. String arg1 = Activity02.ARGS1 = "1";
123. new task().execute(arg1);
124. }
125. }
126.}
package xiaohang.zhimeng;
import android.app.Activity;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.VIEw;
import android.view.VIEw.OnClickListener;
import android.widget.Button;
import android.widget.TextVIEw;
public class Activity02 extends Activity {
public static String ARGS1;
private Button myButton;
private Button myButton01;
private Button myButton02;
private TextView myTextView, textVIEw;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentVIEw(R.layout.main);
myTextView = (TextView) findViewById(R.id.myTextVIEw);
textView = (TextView) findViewById(R.id.textvIEw2);
myButton01 = (Button) findVIEwById(R.id.myButton01);
myButton02 = (Button) findVIEwById(R.id.myButton02);
myButton = (Button) findVIEwById(R.id.myButton);
myButton.setOnClickListener(new MyButtonListener());
myButton02.setOnClickListener(new MyButton02Listener());
myButton01.setOnClickListener(new Button.OnClickListener() {
@Override
public void onClick(VIEw v) {
String arg2 = Activity02.ARGS1 = "2";
new task().execute(arg2);
}
});
}
// myButton02按鈕的監聽器
class MyButton02Listener implements OnClickListener {
@Override
public void onClick(VIEw v) {
String arg3 = Activity02.ARGS1 = "3";
new task().execute(arg3);
}
}
//此類繼承AsyncTask
private class task extends AsyncTask<String,String, String>{
//開啟另外一個線程執行任務
@Override
protected String doInBackground(String...params) {
System.out.println("the thread ID is " + Thread.currentThread().getId());
System.out.println("the thread NAME is " + Thread.currentThread().getName());
String test = params[0];
System.out.println("test value is " + test);
if (params[0] == "1") {
String arg1 = params[0];
return arg1;
}else if(params[0] == "2"){
//開啟音樂服務
startService(new Intent(
"xiaohang.zhimeng.android.MUSIC"));
//獲取參數值
String arg2 = params[0];
return arg2;
}else if (params[0] == "3") {
//停止音樂服務
stopService(new Intent("xiaohang.zhimeng.android.MUSIC"));
//獲取參數值
String arg3 = params[0];
return arg3;
}else {
System.out.println("param post error---->");
}
return null;
}
//執行完成後傳送結果給UI線程 此方法最後執行
protected void onPostExecute(String result) {
CharSequence test_View = myTextVIEw.getText();
String str = test_VIEw.toString();
// 當不等於空的時候
if (!(str.trim().equals(""))) {
String str1 = "";
CharSequence charsq = str1;
myTextVIEw.setText(charsq);
} else {
if (result == "1") {
//將 myTextVIEw 賦值成 "android小子"
String string = "android小子";
myTextVIEw.setText(string);
}else if(result == "2"){//result等於2說明是myButton01那個按鈕也就是開啟音樂服務的那個開始按鈕
//獲取資源文件裡邊的音樂名稱
String tmusicName = getResources().getString(R.raw.test);
int b = tmusicName.lastIndexOf("/");
int e = tmusicName.lastIndexOf(".");
//截取歌曲名稱
String music_Name = tmusicName.substring(b+1, e);
System.out.println("music name is " + music_Name);
// 在textVIEw上顯示歌曲名稱
textVIEw.setText(music_Name);
}else if(result == "3"){
String str_none = "";
CharSequence csq = str_none;
textVIEw.setText(csq);
}else {
System.out.println("param post error");
}
}
}
}
// myButton監聽器 這個按鈕用來 顯示和隱藏 值為"android小子"這個TextVIEw
public class MyButtonListener implements OnClickListener {
@Override
public void onClick(VIEw v) {
System.out.println("wo zhen de zhixing fou???");
//給靜態變量賦值
String arg1 = Activity02.ARGS1 = "1";
new task().execute(arg1);
}
}
}
運行效果大家就得下載源碼運行了,程序有裡邊System.out 的輸出我用來查看一些操作是在那些線程中執行的。大家可以自行過濾。我配置的System.out如下圖所示
下邊也是一個AsyncTask的使用示例 來自eoe 示例名稱:AsyncTask_eoe
只有一個類,類名testAsync
Java代碼
1.package xiaohang.zhimeng;
2.
3.import android.app.Activity;
4.import android.os.AsyncTask;
5.import android.os.Bundle;
6.import android.os.Handler;
7.import android.os.Message;
8.import android.os.SystemClock;
9.import android.widget.TextVIEw;
10.import android.widget.Toast;
11.
12./**
13. * 一個使用異步任務的例子。一般來說一個異步任務只執行一次,這個例子有點非主流,任務結束後會觸發下一次任務執行。
14. * 由任務task在屏幕上打印數字,第一次任務執行由主Activity的onCreate觸發,每次任務結束後
15. * 設定下一次觸發的時間,共執行5次。對於任務來說doInBackground()接收任務的參數params,並執行產生數字的動作,每一個數字
16. * 產生後調用一次publishProgress()來更新UI,這個函數本身也是異步的只是用來發個消息調用完成後立即返回,
17. * 而產生數字的動作在繼續進行。更新界面的操作在onProgressUpdate()中設定。 所有的on函數都由系統調用,不能用戶調用。
18. * 代碼中使用Handler是為了能觸發任務執行,android規定這種異步任務每次執行完就結束,若要重新執行需要new一個新的。
19. * 異步任務只能在UI線程裡面創建和執行
20. */
21.public class testAsync extends Activity {
22. private final int MSG_TIMER = 10000;
23. private TextVIEw vText = null;
24.
25. @Override
26. protected void onCreate(Bundle savedInstanceState) {
27. // TODO Auto-generated method stub
28. super.onCreate(savedInstanceState);
29. setContentVIEw(R.layout.test);
30. vText = (TextView) findViewById(R.id.TextVIEw01);
31. vText.setText("Num...");
32.
33. new task().execute("->");
34.
35. }
36.
37. // 接收任務task發來的消息,觸發一個新的任務
38. private final Handler handler = new Handler() {
39.
40. @Override
41. public void handleMessage(Message msg) {
42. // TODO Auto-generated method stub
43. super.handleMessage(msg);
44. System.out.println("Handler name -----------> " + Thread.currentThread().getName());
45. System.out.println("Handler id ------------> " + Thread.currentThread().getId());
46. switch (msg.what) {
47. case MSG_TIMER:
48. new task().execute("->");
49. break;
50. }
51. }
52. };
53.
54. // 任務執行次數
55. private static int times = 1;
56.
57. // AsyncTask<>的參數類型由用戶設定,這裡設為三個String
58. // 第一個String代表輸入到任務的參數類型,也即是doInBackground()的參數類型
59. // 第二個String代表處理過程中的參數類型,也就是doInBackground()執行過程中的產出參數類型,通過publishProgress()發消息
60. // 傳遞給onProgressUpdate()一般用來更新界面
61. // 第三個String代表任務結束的產出類型,也就是doInBackground()的返回值類型,和onPostExecute()的參數類型
62. private class task extends AsyncTask<String, String, String> {
63.
64. // 後台執行的耗時任務,接收參數並返回結果
65. // 當onPostExecute()執行完,在後台線程中被系統調用
66. @Override
67. protected String doInBackground(String... params) {
68. System.out.println("doInBackground name -----> " + Thread.currentThread().getName());
69. System.out.println("doInBackground id -----> " + Thread.currentThread().getId());
70. // TODO Auto-generated method stub
71. // 在這裡產生數據,送給onProgressUpdate以更新界面
72. String pre = params[0];
73. System.out.println("pre is ----->" + pre);
74.
75. for (int i = 0; i < 5; i++) {
76. System.out.println("note i am begin sleep ");
77. publishProgress(pre + i);
78.
79.
80. // 這裡是否需要停頓下
81. System.out.println("hua li de bu zhuo " + pre + i);
82. SystemClock.sleep(1000);
83. }
84.
85. return "任務結束";
86. }
87.
88. // 任務執行結束後,在UI線程中被系統調用
89. // 一般用來顯示任務已經執行結束
90. @Override
91. protected void onPostExecute(String result) {
92. // TODO Auto-generated method stub
93. System.out.println("onPostExecute name --------> " + Thread.currentThread().getName());
94. System.out.println("onPostExecute id --------> " + Thread.currentThread().getName());
95. super.onPostExecute(result);
96.
97. Toast.makeText(testAsync.this, result, Toast.LENGTH_SHORT).show();
98.
99. // 任務執行5次後推出
100. if (times > 5) {
101. return;
102. }
103.
104. // 設定下一次任務觸發時間
105. Message msg = Message.obtain();
106. msg.what = MSG_TIMER;
107. handler.sendMessageDelayed(msg, 10000L);
108. }
109.
110. // 最先執行,在UI線程中被系統調用
111. // 一般用來在UI中產生一個進度條
112. @Override
113. protected void onPreExecute() {
114. // TODO Auto-generated method stub
115. System.out.println("onPreExecute id -------> " + Thread.currentThread().getId());
116. System.out.println("onPreExecute name -------> " + Thread.currentThread().getName() );
117. super.onPreExecute();
118. Toast.makeText(testAsync.this, "開始執行第" + times + "次任務: " + this,
119. Toast.LENGTH_SHORT).show();
120. times++;
121. }
122.
123. // 更新界面操作,在收到更新消息後,在UI線程中被系統調用
124. @Override
125. protected void onProgressUpdate(String... values) {
126. // TODO Auto-generated method stub
127. System.out.println("onProgressUpdate id ---------> " + Thread.currentThread().getId());
128. System.out.println("onProgressUpdate name -------> " + Thread.currentThread().getName());
129. super.onProgressUpdate(values);
130. vText.append(values[0]);
131. }
132.
133. }
134.
135.}
package xiaohang.zhimeng;
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.os.SystemClock;
import android.widget.TextVIEw;
import android.widget.Toast;
/**
* 一個使用異步任務的例子。一般來說一個異步任務只執行一次,這個例子有點非主流,任務結束後會觸發下一次任務執行。
* 由任務task在屏幕上打印數字,第一次任務執行由主Activity的onCreate觸發,每次任務結束後
* 設定下一次觸發的時間,共執行5次。對於任務來說doInBackground()接收任務的參數params,並執行產生數字的動作,每一個數字
* 產生後調用一次publishProgress()來更新UI,這個函數本身也是異步的只是用來發個消息調用完成後立即返回,
* 而產生數字的動作在繼續進行。更新界面的操作在onProgressUpdate()中設定。 所有的on函數都由系統調用,不能用戶調用。
* 代碼中使用Handler是為了能觸發任務執行,android規定這種異步任務每次執行完就結束,若要重新執行需要new一個新的。
* 異步任務只能在UI線程裡面創建和執行
*/
public class testAsync extends Activity {
private final int MSG_TIMER = 10000;
private TextVIEw vText = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentVIEw(R.layout.test);
vText = (TextView) findViewById(R.id.TextVIEw01);
vText.setText("Num...");
new task().execute("->");
}
// 接收任務task發來的消息,觸發一個新的任務
private final Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
super.handleMessage(msg);
System.out.println("Handler name -----------> " + Thread.currentThread().getName());
System.out.println("Handler id ------------> " + Thread.currentThread().getId());
switch (msg.what) {
case MSG_TIMER:
new task().execute("->");
break;
}
}
};
// 任務執行次數
private static int times = 1;
// AsyncTask<>的參數類型由用戶設定,這裡設為三個String
// 第一個String代表輸入到任務的參數類型,也即是doInBackground()的參數類型
// 第二個String代表處理過程中的參數類型,也就是doInBackground()執行過程中的產出參數類型,通過publishProgress()發消息
// 傳遞給onProgressUpdate()一般用來更新界面
// 第三個String代表任務結束的產出類型,也就是doInBackground()的返回值類型,和onPostExecute()的參數類型
private class task extends AsyncTask<String, String, String> {
// 後台執行的耗時任務,接收參數並返回結果
// 當onPostExecute()執行完,在後台線程中被系統調用
@Override
protected String doInBackground(String... params) {
System.out.println("doInBackground name -----> " + Thread.currentThread().getName());
System.out.println("doInBackground id -----> " + Thread.currentThread().getId());
// TODO Auto-generated method stub
// 在這裡產生數據,送給onProgressUpdate以更新界面
String pre = params[0];
System.out.println("pre is ----->" + pre);
for (int i = 0; i < 5; i++) {
System.out.println("note i am begin sleep ");
publishProgress(pre + i);
// 這裡是否需要停頓下
System.out.println("hua li de bu zhuo " + pre + i);
SystemClock.sleep(1000);
}
return "任務結束";
}
// 任務執行結束後,在UI線程中被系統調用
// 一般用來顯示任務已經執行結束
@Override
protected void onPostExecute(String result) {
// TODO Auto-generated method stub
System.out.println("onPostExecute name --------> " + Thread.currentThread().getName());
System.out.println("onPostExecute id --------> " + Thread.currentThread().getName());
super.onPostExecute(result);
Toast.makeText(testAsync.this, result, Toast.LENGTH_SHORT).show();
// 任務執行5次後推出
if (times > 5) {
return;
}
// 設定下一次任務觸發時間
Message msg = Message.obtain();
msg.what = MSG_TIMER;
handler.sendMessageDelayed(msg, 10000L);
}
// 最先執行,在UI線程中被系統調用
// 一般用來在UI中產生一個進度條
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
System.out.println("onPreExecute id -------> " + Thread.currentThread().getId());
System.out.println("onPreExecute name -------> " + Thread.currentThread().getName() );
super.onPreExecute();
Toast.makeText(testAsync.this, "開始執行第" + times + "次任務: " + this,
Toast.LENGTH_SHORT).show();
times++;
}
// 更新界面操作,在收到更新消息後,在UI線程中被系統調用
@Override
protected void onProgressUpdate(String... values) {
// TODO Auto-generated method stub
System.out.println("onProgressUpdate id ---------> " + Thread.currentThread().getId());
System.out.println("onProgressUpdate name -------> " + Thread.currentThread().getName());
super.onProgressUpdate(values);
vText.append(values[0]);
}
}
}
這個例子來自eoe大家可以好好看看 每個回調方法它都用到了不錯的。還有xh在這裡建議大家去看看泛型的東西 我以前不會 也看了看。不然 自己用AsyncTask類的時候 那幾個方法的參數 會有些暈。我現在還有些暈,有時間一定要好好研究一下。然後接下來的就是多多練習了。
下面這例子也是線程交互的一個例子和上邊的稍有不同大家看看吧,在這個例子中子線程和主線程交互 傳送數據 是通過Bundle對象的方式。在這個例子中大家可以學會怎麼用Bundle對象。
示例名稱:線程交互_Bundle版
只有一個類HandleTest2
Java代碼
1.package mars.handler;
2.
3.import android.app.Activity;
4.import android.os.Bundle;
5.import android.os.Handler;
6.import android.os.HandlerThread;
7.import android.os.Looper;
8.import android.os.Message;
9.
10.public class HandlerTest2 extends Activity {
11.
12. @Override
13. protected void onCreate(Bundle savedInstanceState) {
14. // TODO Auto-generated method stub
15. super.onCreate(savedInstanceState);
16. setContentVIEw(R.layout.main);
17. // 打印了當前線程的ID
18. System.out.println("Activity-->" + Thread.currentThread().getId());
19. // HandlerThread這個類繼承了Thread
20. // 生成一個HandlerThread對象,實現了使用Looper來處理消息隊列的功能,這個類由android應用程序框架提供
21. // 這裡這個參數指定的是線程的名字
22. HandlerThread handlerThread = new HandlerThread("handler_thread");
23. // 在使用HandlerThread的getLooper()方法之前,必須先調用該類的start();
24. handlerThread.start();// 啟動這個線程
25. MyHandler myHandler = new MyHandler(handlerThread.getLooper());
26. // 這裡這個obtainMessage()方法返回
27. Message msg = myHandler.obtainMessage();
28. // 將msg發送到目標對象,所謂的目標對象,就是生成該msg對象的handler對象
29. Bundle b = new Bundle();
30. b.putInt("age", 20);
31. b.putString("name", "Jhon");
32. msg.setData(b);
33. msg.sendToTarget();
34. }
35.
36. class MyHandler extends Handler {
37. public MyHandler() {
38.
39. }
40.
41. public MyHandler(Looper looper) {
42. super(looper);
43. }
44.
45. @Override
46. public void handleMessage(Message msg) {
47. // 這裡我們只做了簡單的輸出
48. Bundle b = msg.getData();
49. int age = b.getInt("age");
50. String name = b.getString("name");
51. System.out.println("age is " + age + ", name is" + name);
52. System.out.println("Handler--->" + Thread.currentThread().getId());
53. System.out.println("handlerMessage");
54. }
55. }
56.}
package mars.handler;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
import android.os.Message;
public class HandlerTest2 extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentVIEw(R.layout.main);
// 打印了當前線程的ID
System.out.println("Activity-->" + Thread.currentThread().getId());
// HandlerThread這個類繼承了Thread
// 生成一個HandlerThread對象,實現了使用Looper來處理消息隊列的功能,這個類由android應用程序框架提供
// 這裡這個參數指定的是線程的名字
HandlerThread handlerThread = new HandlerThread("handler_thread");
// 在使用HandlerThread的getLooper()方法之前,必須先調用該類的start();
handlerThread.start();// 啟動這個線程
MyHandler myHandler = new MyHandler(handlerThread.getLooper());
// 這裡這個obtainMessage()方法返回
Message msg = myHandler.obtainMessage();
// 將msg發送到目標對象,所謂的目標對象,就是生成該msg對象的handler對象
Bundle b = new Bundle();
b.putInt("age", 20);
b.putString("name", "Jhon");
msg.setData(b);
msg.sendToTarget();
}
class MyHandler extends Handler {
public MyHandler() {
}
public MyHandler(Looper looper) {
super(looper);
}
@Override
public void handleMessage(Message msg) {
// 這裡我們只做了簡單的輸出
Bundle b = msg.getData();
int age = b.getInt("age");
String name = b.getString("name");
System.out.println("age is " + age + ", name is" + name);
System.out.println("Handler--->" + Thread.currentThread().getId());
System.out.println("handlerMessage");
}
}
}
布局文件 啥都沒有就一個TextVIEw 為了 維持完成也貼出來吧。
<?XML version="1.0" encoding="utf-8"?>
<LinearLayout XMLns:android="http://schemas.android.com/apk/res/android"
android:orIEntation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextVIEw
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
/>
</LinearLayout>
這裡有一些我學習的時候在網上參考的文章,大家也可以看看 ,重要的就是多練習了。
淺析android線程模型http://www.cppblog.com/fwxjj/archive/2010/05/31/116787.Html
android線程模型(Painless Threading)http://www.cppblog.com/fwxjj/archive/2010/05/31/116788.Html
有關Android線程的學習http://android.blog.51cto.com/268543/343823
android中Message機制的靈活應用http://qaohao.Javaeye.com/blog/509145
http://wghjay.javaeye.com/blog/427086http://wghjay.Javaeye.com/blog/427086
這些我認為寫的還不錯,大家 也可以看看 多多學習總是好事。
下邊羅列我們源碼的下載地址 因為線程交互的那2個例子裡邊有一些資源文件所以會比較大eye傳不上來 ,我傳到趣盤了給大家下載。
xh_android_Test_1_2_線程交互 下載地址 趣盤下載http://hangvip.qupan.cc/6789636.Html
XH_android_Test_1_2_SyncTask_Demo_線程交互_AsyncTask版 http://hangvip.qupan.cc/6789683.Html
android_Test_01_AsyncTask_eoe 附件下載
建議大家用IE下載直接把鏈接復制到IE下載 然後點迅雷下載 如果沒安裝迅雷 會彈出普通的下載方式,而火狐 貌似 只能用迅雷下了 還有趣盤有很多廣告很惡心,大家忍住。
所有例子的測試平台 均為 android2.0 APILEVEL 5 下載鏈接已測試可用 ,如果大家發現不可以下載可以留言給我。
本文來自CSDN博客,轉載請標明出處:http://blog.csdn.Net/xqhrs232/archive/2010/12/24/6095684.ASPx
簡介: BFS 是一款專門為 Linux 桌面環境所設計的內核調度器,它基於 Staircase Deadline 和 EEVDF 算法,支持 Linux 2
簡介: 學習如何使用混合應用程序編程模型為 WebSphere® Commerce 構建移動應用程序。本文描述混合模型,它與其他移動應用程序編程模型的
簡介: 一直以來,“對多個浏覽器進行測試” 像是一條難以解開的咒語,因為需要對大量浏覽器進行測試。對所有浏覽器進行測試(尤其是目前)幾乎是不可能的。但是這比您
簡介: HTML 5 中一個最有用的新特性是本地存儲的標准化。最終,Web 開發人員可以不再試圖將所有客戶端數據都填塞到 4 KB 的 CookIEs 中。現