Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 中級開發 >> Android線程的交互,以及使用方法(3)

Android線程的交互,以及使用方法(3)

編輯:中級開發

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

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved