總網頁瀏覽量

2012年3月24日 星期六

Broadcast 設計


Broadcast 廣播機制

//傳送廣播
public class SentBroadcas extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

Button b1 = (Button) findViewById(R.id.Button01);
//點擊Button後發送廣播
b1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent().setAction("android.intent.test")
sendBroadcast(intent);
}
});
}
}

//接收廣播
public class BroadcastReciever extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if(intent.getAction().equals("android.intent.test")){
}
}
}


//在AndroidManifest.xml註冊
<receiver android:name="BroadcastReciever">
    <intent -filter="">
        <action android:name="android.intent.test">
        </action></intent>
</receiver>

----------------------------------------------------------------------------------------------




2012年3月5日 星期一

Android Handler


Handler
使用Handler的post方法,將要執行的執行緒物件加到佇列中
handler.post(updateThread); 馬上加入到消息佇列內

創造一個Handler物件
Handler handler = new Handler();

將要執行的功能寫到執行緒物件的run方法中
Runnable updateThread = new Runnable(){
        @override
        public void run(){
        System.out.println(“UpdareThread”);
        handler.postDelayed(updateThread, 3000); 每3000毫秒加一次
}
}
將Thread移除
handler.removeCallbacks(updateThread);

將ProgressBar加入到Handler
根據控制鍵ID取的代表控制鍵的物件,並為按鈕設置監聽器
Runnable updateThread = new Runnable(){
int i = 0 ;
        @Override
        public void run() {
            System.out.println("Begin Thread");
            i = i + 10 ;
                //取的一個消息物件,Message類別由Android操作系統提供
            Message msg = updateBarHandler.obtainMessage();
                //將msg物件的arg1參數設置為I,用arg1和arg2這兩個成員資料傳遞消息,優點為系統  性能消耗較少
            msg.arg1 = i ;
            try {
                        //設置當前執行緒睡眠1秒
                        Thread.sleep(1000);
            } catch (InterruptedException e) {
                        e.printStackTrace();
            }
                //將msg物件加入到消息佇列中
                updateBarHandler.sendMessage(msg);
            if( i == 100){ //當i值為100時,將執行緒物件從Handler中移除
                        updateBarHandler.removeCallbacks(updateThread);
            }
        }
};

//使用匿名內部類別來覆寫Handler中的handleMessage方法
Handler updateBarHandler = new Handler(){
@Override
public void handleMessage(Message msg) { //取得Message msg
bar.setProgress(msg.arg1);
updateBarHandler.post(updateThread);
}

sendMessage(msg); 送msg到佇列
handleMessage(Message msg) 從佇列取msg

Handler不是產生一個thread來執行而是直接使用runnable方法

Bundle 類似鍵值對


HandlerThread 實作了looper來處理消息佇列功能
這個類別由Android應用程序框架提供
HandlerThread  handlerThread = new HandlerThread(“handler_thread”);
handlerThread.start();
MyHandler myHandler = new MyHandler(handlerThread.getLooper());
Message msg = myHandler.obtainMessage(); //得到消息
Msg.sendToTarget(); //將msg發送到目標物件,所謂的目標物件就是生成msg物件的handler物件

class MyHandler exteands Handler{
        public MyHandler(){
}
Public MyHandler(Looper looper){ //將handler綁定到looper上
        super(looper);
}
}

傳送資料與取得資料
msg.obj=”abc”;
String s = (String)msg.obj;

傳送大量資料利用Bundle
Bundle b = new Bundle();
b.putInt(“age”, 20);
b.putString(“name”, “Jhon”);
msg.setData(b);
msg.sendToTarget();

取資料
Bundle b = msg.getData();
Int ag = b.getInt(“age”);
String name = b.getString(“name”);

2012年2月22日 星期三

JAVA設計模式


複合(composition)或聚合(aggregation) ---   has-a
即以既有的classes合成新的class
將某個class物件置於另一個class內
新的classes可由任意數目 任意型別的他種物件組成

繼承
父類別 --- base class, super class, parent class
子類別 --- derived class, inherited class, sub class, child class
子類別完全覆寫父類別 is-a
子類別加入新介面元素 is-like-a

陣列宣告
1. Integer[] a = new Integer[3];
2. Integer[] a = new Integer[] {new Integer(1), new Integer(2), 3,};
3. Integer[] a = {new Integer(1), new Integer(2), 3,};
//初值列最後的逗號可有可無


委任(delegation)
介於繼承與合成之間,將成員物件置於新建立的class中(類似合成),但同時又將該成員的所有methods都放到新的class中,成為新的class介面的一部分(類似繼承)。

向上轉型(upcasting)
在derived class中可以使用base class的所有函式,所以任何可發送給base class的訊息,也都可以發送給derived class

多型(Polymorphism)
介面與實作分離,

工廠模式
用已產生其他其他類別的類別

抽象類別(abstract class)
用來表示介面,沒有專屬的實作內容,含有0個或1個以上的abstract method的類別稱為abstract class,且不可產生物件,繼承abstract class的derived class需要實作abstract method。

介面(interface)
可以內含資料成員,但這些資料成員都會自然成為static和final,介面只提供形式,不含實作內容,介面可允許設計出可向上轉型至多個基礎型別的class,以達到多重繼承的變形,且不可產生物件

Strategy設計模式
依據所傳入的引數物件不同,而有不同行為展現的method

Adapter
撰寫程式碼來接收既有的介面,並且產生你所需的介面



class Member{
private int mid;
private String name;
private Car car;
public Member(int mid, String name){
this.mid = mid;
this.name = name;
}
public String getMemberInfo() {
return "編號" + this.mid + ", 姓名" + this.name;
}
public void setCar(Car car){
this.car = car;
}
public Car getCar(){
return this.car;
}
}
class Car{
private Member member;
private String name;
public Car(String name){
this.name = name;
}
public String getCarInfo(){
return "車的名稱 " + this.name;
}
public void setMember(Member member){
this.member = member;
}
public Member getMember(){
return this.member;
}
}

public class Hello {
public static void main(String args[]) {
Member mem = new Member(1, "kent");
Car car = new Car("BMW");
mem.setCar(car);
car.setMember(mem);
System.out.println(mem.getMemberInfo());
System.out.println(mem.getCar().getCarInfo());
}
}







class Node{
                private String data;
                private Node next;
                public Node(String data){
                                this.data = data;
                }
                public void setNext(Node next){
                                this.next = next;
                }
                public Node getNext(){
                                return this.next;
                }
                public String getData(){
                                return this.data;
                }
                public void addNode(Node newNode){
                                if(this.next == null){
                                                this.next = newNode;
                                }else{
                                                this.next.addNode(newNode);
                                }
                }
                public void printNode(){
                                System.out.println(this.data);
                                if(this.next != null){
                                                this.next.printNode();
                                }
                }
                public boolean containsNode(String data){
                                if(this.data.equals(data)){
                                                return true;
                                }else{
                                                if(this.next != null){
                                                                return this.next.containsNode(data);
                                                }else{
                                                                return false;
                                                }
                                }
                }
                public void removeNode(Node previous, String data){
                                if(this.data.equals(data)){
                                                previous.next = this.next;
                                }else{
                                                this.next.removeNode(this, data);
                                }
                }
}

class Link{
                private Node root;
                public void add(String data){
                                if(data == null){
                                                return;
                                }
                                Node newNode = new Node(data);
                                if(this.root == null){
                                                this.root = newNode;
                                }else{
                                                this.root.addNode(newNode);
                                }
                }
                public void print(){
                                if(this.root != null){
                                                this.root.printNode();
                                }
                }
                public boolean contains(String data){
                                if(data == null || this.root == null){
                                                return false;
                                }
                                return this.root.containsNode(data);
                }
                public void remove(String data){
                                if(this.contains(data)){
                                                if(this.root.getData().equals(data)){
                                                                this.root = this.root.getNext();
                                                }else{
                                                                this.root.getNext().removeNode(this.root, data);
                                                }
                                }
                }
}

public class Hello{
                public static void main(String args[]){
                                Link all = new Link();
                                all.add("A");
                                all.add("B");
                                all.add("C");
                                all.remove("B");
                                all.remove("A");
                                all.print();
                                System.out.println(all.contains("A"));
                                System.out.println(all.contains("X"));
                               
                }
}


2012年1月29日 星期日

Android筆記

Google! Android 3(gasolin著)中的一些筆記

android:orientation 版面走向
fill_parent 填滿整個上層元件
wrap_content 包住內容, 隨文字欄位行數的不同而改變介面元件的高度

<EditText android:id="@+id/height" />
@ 提示XML解析器應該把後面的字串解析成識別符號
+  代表新建一個識別符號
id/  識別符號會被歸類在id類別下

string.xml
<string name="識別符號">文字敘述</string>
<string name="bmi_height">身高(cm)</string>

main.xml
<TextView android:text ="@string/bmi_height" />

重構模式:
好處為方便修改程式與整理,
 findViews();
 setListensers();

在android上設計對話框:
 private void openOptionDialog(){
    AlertDialog.Builder dialog = new AlertDialog.Builder(Main.this);
    dialog.setTitle("");
    dialog.setMessage("");
    dialog.show();

解決產生實體時所造成的記憶體消耗, 使用匿名方法, 並加入確認按鍵

    private void openOptionDialog(){
    new AlertDialog.Builder(Main.this)
    .setTitle(R.string.about_title)
    .setMessage(R.string.about_msg)
    .setPositiveButton("確認", new DialogInterface.OnClickListener(){
    public void onClick(DialogInterface dialoginterface, int i){
    }
    })
    .show();
    }

使用Toast函式對話框:
    private void openOptionDialog(){
    /*Toast popup = Toast.makeText(Main.this, "BMI 計算器", Toast.LENGTH_SHORT);
    popup.show();*/
    //匿名呼叫
    Toast.makeText(Main.this, "BMI 計算器", Toast.LENGTH_SHORT).show();
    }










2012年1月27日 星期五

C指標

指標 int *ptr;   陣列 int array[10];

陣列指定給指標:
ptr = array;  或者是  ptr = &array[0];
寫array跟&array[0]是相同的
===> a[i]就可寫為 *(a + i)

若指標ptr為指向陣列的第一個元素array[0]
則 *(ptr + 1)表示指向array[1], 第二個元素 ===> *(ptr+i) 指向 array[i]

char *array[] 指標陣列 ===> *array[i]指向文字列的第一個字元
char (*array)[] 指標指向陣列

int *f(); f為函數, 傳回值為指向整數的指標   ----------    函式返回指標
int (*f)(); f是個指標, 指向一個會傳回整數的函數   ---------   函式指標

const char i=5; 不可改值寫法
int* const: 指向const的指標 可以改值, 不可以改位址
const int* const:指向const的const指標


typedef int (*fp)(char a);
fp = fun;   //fun為一個指向函數的函數指標(參數為char值, 返回值為int)
int x = fun('x');

char (*(*x( )) [] )( ):函數, 傳回一指標,該指標指向指標陣列, 陣列中各元素指向一個會傳回char值的函數

char (*(*x[3]) ( )) [5]: 指標陣列, 有3個元素, 各指向一個會傳回另一指標的函數, 該指標是指向含有5個元素的字元陣列


錯誤: int *ptr;
        *ptr = 35;

正確: int *ptr, number = 10;
        ptr = &number;

ptri 位址為 0012ff84
ptri +1 位址改為  0012ff88
取得鄰近位址內的值 *(ptr+1)



記憶體配置:
配置一個浮點數指標
float *fp;
fp = (float *)malloc(sizeof(float));
free(fp);


int *num;
num = (int *)malloc(sizeof(int) * 10)
free(num)

int array[10][20]

int **array= (int **)malloc(sizeof(int*)*10);
for(i=0;i<10;i++)
   *(array+i) = (int *)malloc(sizeof(int) * 20);


------------------------------------------------------------------------------------

struct grade
{
    int math;
    int english;
    int computer;
};
struct grade *student;
student = (struct grade *) malloc(num * sizeof(struct grade));

------------------------------------------------------------------------------------

鏈結串列:
struct list                    
{
   int num;                    
   char name[10];            
   char address[50];    
   struct list *next;
};
typedef struct list node;
typedef node *link;

ptr = ( link ) malloc(sizeof(node));
ptr->next = NULL;

------------------------------------------------------------------------------------