<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    java something

    不要以為......很遙遠(yuǎn)
    隨筆 - 23, 文章 - 1, 評(píng)論 - 2, 引用 - 0
    數(shù)據(jù)加載中……

    2011年8月23日

    Activity生命周期

    現(xiàn)有兩個(gè)Activity:  Activity1,Activity2

    先啟動(dòng)Activity1運(yùn)行順序?yàn)椋?Activity1 onCreate -> Activity1 onStart -> Activity1 onResume
    用Intent從Activity1跳到Activity2運(yùn)行順序 : 
    Activity1 onPause -> Activity2 onCreate -> Activity2 onStart -> Activity2 onResume ->Activity1 onStop -> Activity1  onDestroy
    退出應(yīng)用程序: Activity2 onResume ->Activity2 onStop -> Activity2  onDestroy

    posted @ 2011-09-02 17:48 Jamie 閱讀(222) | 評(píng)論 (0)編輯 收藏

    控制3個(gè)線程運(yùn)行順序的Demo

    本程序可以控制3個(gè)線程按順序執(zhí)行, 代碼如下:

    public class Test3 {

     public static void main(String[] args) throws IOException {
      final Test obj = new Test();
      
      new Thread()
      {
       public void run()
       {
        obj.m1();
       }
      }.start();
      new Thread()
      {
       public void run()
       {
        obj.m2();
       }
      }.start();
      new Thread()
      {
       public void run()
       {
        obj.m3();
       }
      }.start();
      
     }

    }

    class Test
    {
     static int count;
     volatile int target = 1;
     synchronized void m1()
     { 
       for (int i = 0; i < 10; i++)
       {
        while (target == 2 || target == 3)
        {
         try {
          wait();
         } catch (InterruptedException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
         }
        }
        System.out.println("m1() =" + i);
        target = 2;
        notifyAll();
       }
     }
     
     synchronized void m2()
     {
      for (int i = 0; i < 10; i++)
      {
       while (target == 1 || target == 3)
       {
        try {
         wait();
        } catch (InterruptedException e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
        }
       }
       System.out.println("m2() =" + i);
       target = 3;
       notifyAll();
      }
     }
     
     synchronized void m3()
     {
      for (int i = 0; i < 10; i++)
      {
       while (target == 1 || target == 2)
       {
        try {
         wait();
        } catch (InterruptedException e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
        }
       }
       System.out.println("m3() =" + i);
       target = 1;
       notifyAll();
      }
     }
    }

    posted @ 2011-09-02 02:27 Jamie 閱讀(1769) | 評(píng)論 (2)編輯 收藏

    線程的同步與共享

         摘要: 線程的同步與共享 前面程序中的線程都是獨(dú)立的、異步執(zhí)行的線程。但在很多情況下,多個(gè)線程需要共享數(shù)據(jù)資源,這就涉及到線程的同步與資源共享的問(wèn)題。 1 資源沖突 下面的例子說(shuō)明,多個(gè)線程共享資源,如果不加以控制可能會(huì)產(chǎn)生沖突。 程序CounterTest.java   Code highlighting produced by Actipro CodeHighlight...  閱讀全文

    posted @ 2011-09-02 01:38 Jamie 閱讀(477) | 評(píng)論 (0)編輯 收藏

    線程的狀態(tài)與調(diào)度

      1,線程的生命周期

            線程從創(chuàng)建、運(yùn)行到結(jié)束總是處于下面五個(gè)狀態(tài)之一:新建狀態(tài)、就緒狀態(tài)、運(yùn)行狀態(tài)、阻塞狀態(tài)及死亡狀態(tài)。



        1.新建狀態(tài)(New): 
            當(dāng)用new操作符創(chuàng)建一個(gè)線程時(shí), 例如new Thread(r),線程還沒(méi)有開(kāi)始運(yùn)行,此時(shí)線程處在新建狀態(tài)。 當(dāng)一個(gè)線程處于新生狀態(tài)時(shí),程序還沒(méi)有開(kāi)始運(yùn)行線程中的代碼

         2.就緒狀態(tài)(Runnable)

            一個(gè)新創(chuàng)建的線程并不自動(dòng)開(kāi)始運(yùn)行,要執(zhí)行線程,必須調(diào)用線程的start()方法。當(dāng)線程對(duì)象調(diào)用start()方法即啟動(dòng)了線程,start()方法創(chuàng)建線程運(yùn)行的系統(tǒng)資源,并調(diào)度線程運(yùn)行run()方法。當(dāng)start()方法返回后,線程就處于就緒狀態(tài)。

            處于就緒狀態(tài)的線程并不一定立即運(yùn)行run()方法,線程還必須同其他線程競(jìng)爭(zhēng)CPU時(shí)間,只有獲得CPU時(shí)間才可以運(yùn)行線程。因?yàn)樵趩?/span>CPU的計(jì)算機(jī)系統(tǒng)中,不可能同時(shí)運(yùn)行多個(gè)線程,一個(gè)時(shí)刻僅有一個(gè)線程處于運(yùn)行狀態(tài)。因此此時(shí)可能有多個(gè)線程處于就緒狀態(tài)。對(duì)多個(gè)處于就緒狀態(tài)的線程是由Java運(yùn)行時(shí)系統(tǒng)的線程調(diào)度程序(thread scheduler)來(lái)調(diào)度的。

        3.運(yùn)行狀態(tài)(Running)

            當(dāng)線程獲得CPU時(shí)間后,它才進(jìn)入運(yùn)行狀態(tài),真正開(kāi)始執(zhí)行run()方法.

        
    4. 阻塞狀態(tài)(Blocked)

            線程運(yùn)行過(guò)程中,可能由于各種原因進(jìn)入阻塞狀態(tài):
            1>線程通過(guò)調(diào)用sleep方法進(jìn)入睡眠狀態(tài);
            2>線程調(diào)用一個(gè)在I/O上被阻塞的操作,即該操作在輸入輸出操作完成之前不會(huì)返回到它的調(diào)用者;
            3>線程試圖得到一個(gè)鎖,而該鎖正被其他線程持有;
            4>線程在等待某個(gè)觸發(fā)條件;
            ......           

            所謂阻塞狀態(tài)是正在運(yùn)行的線程沒(méi)有運(yùn)行結(jié)束,暫時(shí)讓出
    CPU,這時(shí)其他處于就緒狀態(tài)的線程就可以獲得CPU時(shí)間,進(jìn)入運(yùn)行狀態(tài)。

        5. 死亡狀態(tài)(Dead)

            有兩個(gè)原因會(huì)導(dǎo)致線程死亡:
            1) run方法正常退出而自然死亡,
            2) 一個(gè)未捕獲的異常終止了run方法而使線程猝死。
            為了確定線程在當(dāng)前是否存活著(就是要么是可運(yùn)行的,要么是被阻塞了),需要使用isAlive方法。如果是可運(yùn)行或被阻塞,這個(gè)方法返回true; 如果線程仍舊是new狀態(tài)且不是可運(yùn)行的, 或者線程死亡了,則返回false.




    2,  線程的優(yōu)先級(jí)和調(diào)度

    Java的每個(gè)線程都有一個(gè)優(yōu)先級(jí),當(dāng)有多個(gè)線程處于就緒狀態(tài)時(shí),線程調(diào)度程序根據(jù)線程的優(yōu)先級(jí)調(diào)度線程運(yùn)行。

    可以用下面方法設(shè)置和返回線程的優(yōu)先級(jí)。

        · public final void setPriority(int newPriority) 設(shè)置線程的優(yōu)先級(jí)。

        · public final int getPriority() 返回線程的優(yōu)先級(jí)。

    newPriority為線程的優(yōu)先級(jí),其取值為110之間的整數(shù),也可以使用Thread類(lèi)定義的常量來(lái)設(shè)置線程的優(yōu)先級(jí),這些常量分別為:Thread.MIN_PRIORITY、Thread.NORM_PRIORITY、Thread.MAX_PRIORITY,它們分別對(duì)應(yīng)于線程優(yōu)先級(jí)的1、510,數(shù)值越大優(yōu)先級(jí)越高。當(dāng)創(chuàng)建Java線程時(shí),如果沒(méi)有指定它的優(yōu)先級(jí),則它從創(chuàng)建該線程那里繼承優(yōu)先級(jí)。

    一般來(lái)說(shuō),只有在當(dāng)前線程停止或由于某種原因被阻塞,較低優(yōu)先級(jí)的線程才有機(jī)會(huì)運(yùn)行。

    前面說(shuō)過(guò)多個(gè)線程可并發(fā)運(yùn)行,然而實(shí)際上并不總是這樣。由于很多計(jì)算機(jī)都是單CPU的,所以一個(gè)時(shí)刻只能有一個(gè)線程運(yùn)行,多個(gè)線程的并發(fā)運(yùn)行只是幻覺(jué)。在單CPU機(jī)器上多個(gè)線程的執(zhí)行是按照某種順序執(zhí)行的,這稱(chēng)為線程的調(diào)度(scheduling)。

    大多數(shù)計(jì)算機(jī)僅有一個(gè)CPU,所以線程必須與其他線程共享CPU。多個(gè)線程在單個(gè)CPU是按照某種順序執(zhí)行的。實(shí)際的調(diào)度策略隨系統(tǒng)的不同而不同,通常線程調(diào)度可以采用兩種策略調(diào)度處于就緒狀態(tài)的線程。

    (1) 搶占式調(diào)度策略

         Java運(yùn)行時(shí)系統(tǒng)的線程調(diào)度算法是搶占式的 (preemptive)。Java運(yùn)行時(shí)系統(tǒng)支持一種簡(jiǎn)單的固定優(yōu)先級(jí)的調(diào)度算法。如果一個(gè)優(yōu)先級(jí)比其他任何處于可運(yùn)行狀態(tài)的線程都高的線程進(jìn)入就緒狀態(tài),那么運(yùn)行時(shí)系統(tǒng)就會(huì)選擇該線程運(yùn)行。新的優(yōu)先級(jí)較高的線程搶占(preempt)了其他線程。但是Java運(yùn)行時(shí)系統(tǒng)并不搶占同優(yōu)先級(jí)的線程。換句話說(shuō),Java運(yùn)行時(shí)系統(tǒng)不是分時(shí)的(time-slice)。然而,基于Java Thread類(lèi)的實(shí)現(xiàn)系統(tǒng)可能是支持分時(shí)的,因此編寫(xiě)代碼時(shí)不要依賴(lài)分時(shí)。當(dāng)系統(tǒng)中的處于就緒狀態(tài)的線程都具有相同優(yōu)先級(jí)時(shí),線程調(diào)度程序采用一種簡(jiǎn)單的、非搶占式的輪轉(zhuǎn)的調(diào)度順序。

    (2) 時(shí)間片輪轉(zhuǎn)調(diào)度策略

        有些系統(tǒng)的線程調(diào)度采用時(shí)間片輪轉(zhuǎn)(round-robin)調(diào)度策略。這種調(diào)度策略是從所有處于就緒狀態(tài)的線程中選擇優(yōu)先級(jí)最高的線程分配一定的CPU時(shí)間運(yùn)行。該時(shí)間過(guò)后再選擇其他線程運(yùn)行。只有當(dāng)線程運(yùn)行結(jié)束、放棄(yield)CPU或由于某種原因進(jìn)入阻塞狀態(tài),低優(yōu)先級(jí)的線程才有機(jī)會(huì)執(zhí)行。如果有兩個(gè)優(yōu)先級(jí)相同的線程都在等待CPU,則調(diào)度程序以輪轉(zhuǎn)的方式選擇運(yùn)行的線程。

     3.  線程狀態(tài)的改變

    一個(gè)線程在其生命周期中可以從一種狀態(tài)改變到另一種狀態(tài),線程狀態(tài)的變遷如圖所示:

        
        
    1>  控制線程的啟動(dòng)和結(jié)束

    當(dāng)一個(gè)新建的線程調(diào)用它的start()方法后即進(jìn)入就緒狀態(tài),處于就緒狀態(tài)的線程被線程調(diào)度程序選中就可以獲得CPU時(shí)間,進(jìn)入運(yùn)行狀態(tài),該線程就開(kāi)始運(yùn)行run()方法。

    控制線程的結(jié)束稍微復(fù)雜一點(diǎn)。如果線程的run()方法是一個(gè)確定次數(shù)的循環(huán),則循環(huán)結(jié)束后,線程運(yùn)行就結(jié)束了,線程對(duì)象即進(jìn)入死亡狀態(tài)。如果run()方法是一個(gè)不確定循環(huán),早期的方法是調(diào)用線程對(duì)象的stop()方法,然而由于該方法可能導(dǎo)致線程死鎖,因此從1.1版開(kāi)始,不推薦使用該方法結(jié)束線程。一般是通過(guò)設(shè)置一個(gè)標(biāo)志變量,在程序中改變標(biāo)志變量的值實(shí)現(xiàn)結(jié)束線程。請(qǐng)看下面的例子:

    程序 ThreadStop.java

    import java.util.*;

    class Timer implements Runnable{

        
    boolean flag=true;
        
    public void run(){
          
    while(flag){
            System.out.print(
    "\r\t"+new Date()+"");
            
    try{
                  Thread.sleep(
    1000);
            }
    catch(InterruptedException e){} 
          }
          System.out.println(
    "\n"+Thread.currentThread().getName()+" Stop");
        }

        
    public void stopRun(){
               flag 
    = false;
        }
    }

    public class ThreadStop{
        
    public static void main(String args[]){
           Timer timer 
    = new Timer();
           Thread thread 
    = new Thread(timer);       
           thread.setName(
    "Timer");
           thread.start();

           
    for(int i=0;i<100;i++){
             System.out.print(
    "\r"+i);
            
    try{
                  Thread.sleep(
    100);
            }
    catch(InterruptedException e){} 
           }     
           timer.stopRun();
        }
    }

    該程序在Timer類(lèi)中定義了一個(gè)布爾變量flag,同時(shí)定義了一個(gè)stopRun()方法,在其中將該變量設(shè)置為false。在主程序中通過(guò)調(diào)用該方法,從而改變?cè)撟兞康闹?,使?/span>run()方法的while循環(huán)條件不滿(mǎn)足,從而實(shí)現(xiàn)結(jié)束線程的運(yùn)行。

    說(shuō)明  Thread類(lèi)中除了stop()方法被標(biāo)注為不推薦(deprecated) 使用外,suspend()方法和resume()方法也被標(biāo)明不推薦使用,這兩個(gè)方法原來(lái)用作線程的掛起和恢復(fù).

    2>  線程阻塞條件

    處于運(yùn)行狀態(tài)的線程除了可以進(jìn)入死亡狀態(tài)外,還可能進(jìn)入就緒狀態(tài)和阻塞狀態(tài)。下面分別討論這兩種情況:

    (1) 運(yùn)行狀態(tài)到就緒狀態(tài)

    處于運(yùn)行狀態(tài)的線程如果調(diào)用了yield()方法,那么它將放棄CPU時(shí)間,使當(dāng)前正在運(yùn)行的線程進(jìn)入就緒狀態(tài)。這時(shí)有幾種可能的情況:如果沒(méi)有其他的線程處于就緒狀態(tài)等待運(yùn)行,該線程會(huì)立即繼續(xù)運(yùn)行;如果有等待的線程,此時(shí)線程回到就緒狀態(tài)狀態(tài)與其他線程競(jìng)爭(zhēng)CPU時(shí)間,當(dāng)有比該線程優(yōu)先級(jí)高的線程時(shí),高優(yōu)先級(jí)的線程進(jìn)入運(yùn)行狀態(tài),當(dāng)沒(méi)有比該線程優(yōu)先級(jí)高的線程時(shí),但有同優(yōu)先級(jí)的線程,則由線程調(diào)度程序來(lái)決定哪個(gè)線程進(jìn)入運(yùn)行狀態(tài),因此線程調(diào)用yield()方法只能將CPU時(shí)間讓給具有同優(yōu)先級(jí)的或高優(yōu)先級(jí)的線程而不能讓給低優(yōu)先級(jí)的線程。

    一般來(lái)說(shuō),在調(diào)用線程的yield()方法可以使耗時(shí)的線程暫停執(zhí)行一段時(shí)間,使其他線程有執(zhí)行的機(jī)會(huì)。

    (2) 運(yùn)行狀態(tài)到阻塞狀態(tài)

    有多種原因可使當(dāng)前運(yùn)行的線程進(jìn)入阻塞狀態(tài),進(jìn)入阻塞狀態(tài)的線程當(dāng)相應(yīng)的事件結(jié)束或條件滿(mǎn)足時(shí)進(jìn)入就緒狀態(tài)。使線程進(jìn)入阻塞狀態(tài)可能有多種原因:

    線程調(diào)用了sleep()方法,線程進(jìn)入睡眠狀態(tài),此時(shí)該線程停止執(zhí)行一段時(shí)間。當(dāng)時(shí)間到時(shí)該線程回到就緒狀態(tài),與其他線程競(jìng)爭(zhēng)CPU時(shí)間。

    Thread類(lèi)中定義了一個(gè)interrupt()方法。一個(gè)處于睡眠中的線程若調(diào)用了interrupt()方法,該線程立即結(jié)束睡眠進(jìn)入就緒狀態(tài)。

    如果一個(gè)線程的運(yùn)行需要進(jìn)行I/O操作,比如從鍵盤(pán)接收數(shù)據(jù),這時(shí)程序可能需要等待用戶(hù)的輸入,這時(shí)如果該線程一直占用CPU,其他線程就得不到運(yùn)行。這種情況稱(chēng)為I/O阻塞。這時(shí)該線程就會(huì)離開(kāi)運(yùn)行狀態(tài)而進(jìn)入阻塞狀態(tài)。Java語(yǔ)言的所有I/O方法都具有這種行為。

    ③ 有時(shí)要求當(dāng)前線程的執(zhí)行在另一個(gè)線程執(zhí)行結(jié)束后再繼續(xù)執(zhí)行,這時(shí)可以調(diào)用join()方法實(shí)現(xiàn),join()方法有下面三種格式:

    ·         public void join() throws InterruptedException 使當(dāng)前線程暫停執(zhí)行,等待調(diào)用該方法的線程結(jié)束后再執(zhí)行當(dāng)前線程。

    ·         public void join(long millis) throws InterruptedException 最多等待millis毫秒后,當(dāng)前線程繼續(xù)執(zhí)行。

    ·         public void join(long millis, int nanos) throws InterruptedException 可以指定多少毫秒、多少納秒后繼續(xù)執(zhí)行當(dāng)前線程。

    上述方法使當(dāng)前線程暫停執(zhí)行,進(jìn)入阻塞狀態(tài),當(dāng)調(diào)用線程結(jié)束或指定的時(shí)間過(guò)后,當(dāng)前線程線程進(jìn)入就緒狀態(tài),例如執(zhí)行下面代碼:

    t.join();

    將使當(dāng)前線程進(jìn)入阻塞狀態(tài),當(dāng)線程t執(zhí)行結(jié)束后,當(dāng)前線程才能繼續(xù)執(zhí)行。

    ④ 線程調(diào)用了wait()方法,等待某個(gè)條件變量,此時(shí)該線程進(jìn)入阻塞狀態(tài)。直到被通知(調(diào)用了notify()notifyAll()方法)結(jié)束等待后,線程回到就緒狀態(tài)。

    另外如果線程不能獲得對(duì)象鎖,也進(jìn)入就緒狀態(tài)。

    后兩種情況在下一節(jié)討論。



















    posted @ 2011-09-01 21:43 Jamie 閱讀(4001) | 評(píng)論 (0)編輯 收藏

    復(fù)習(xí)下java多線程

    好久沒(méi)搞這個(gè)了,今天把以前的筆記整理下,當(dāng)復(fù)習(xí)。

    Thread類(lèi)和Runnable接口

    多線程是一個(gè)程序中可以有多段代碼同時(shí)運(yùn)行,那么這些代碼寫(xiě)在哪里,如何創(chuàng)建線程對(duì)象呢?

        首先,我們來(lái)看Java語(yǔ)言實(shí)現(xiàn)多線程編程的類(lèi)和接口。在java.lang包中定義了Runnable接口和Thread類(lèi)。

     

    Runnable接口中只定義了一個(gè)方法:

    ·         public abstract void run()

    這個(gè)方法要由實(shí)現(xiàn)了Runnable接口的類(lèi)實(shí)現(xiàn)。Runnable對(duì)象稱(chēng)為可運(yùn)行對(duì)象,一個(gè)線程的運(yùn)行就是執(zhí)行該對(duì)象的run()方法。


          Thread
    類(lèi)實(shí)現(xiàn)了Runnable接口,因此Thread對(duì)象也是可運(yùn)行對(duì)象。同時(shí)Thread類(lèi)也是線程類(lèi),該類(lèi)的常用構(gòu)造方法如下:

    ·         public Thread()

    ·         public Thread(Runnable target)

    ·         public Thread(String name)

    ·         public Thread(Runnable target, String name)
    target為線程運(yùn)行的目標(biāo)對(duì)象,即線程調(diào)用start()方法啟動(dòng)后運(yùn)行那個(gè)對(duì)象的run()方法,該對(duì)象的類(lèi)型為Runnable,若沒(méi)有指定目標(biāo)對(duì)象,則以當(dāng)前類(lèi)對(duì)象為目標(biāo)對(duì)象,name為線程名


     

      線程的創(chuàng)建 

    介紹下如何創(chuàng)建和運(yùn)行線程的兩種方法。線程運(yùn)行的代碼就是實(shí)現(xiàn)了Runnable接口的類(lèi)的run()方法或者是Thread類(lèi)的子類(lèi)的run()方法,因此構(gòu)造線程體就有兩種方法:
        ·         繼承Thread類(lèi)并覆蓋它的run()方法;
        ·        
    實(shí)現(xiàn)Runnable接口并實(shí)現(xiàn)它的run()方法。

      1,繼承Thread類(lèi)創(chuàng)建線程

    通過(guò)繼承Thread類(lèi),并覆蓋run()方法,這時(shí)就可以用該類(lèi)的實(shí)例作為線程的目標(biāo)對(duì)象。下面的程序定義了SimpleThread類(lèi),它繼承了Thread類(lèi)并覆蓋了run()方法。

    程序SimpleThread.java

    public class SimpleThread extends Thread{

      public SimpleThread(String str){

        super(str);

    }

    public void run(){

        for(int i=0; i<100; i++){

          System.out.println(getName()+" = "+ i);

          try{

             sleep((int)(Math.random()*100));

          }catch(InterruptedException e){}

        }

    System.out.println(getName()+ " DONE");

    }

    }

    _____________________________________________________________________________

        SimpleThread類(lèi)繼承了Thread類(lèi),并覆蓋了run()方法,該方法就是線程體。

    程序 ThreadTest.java

    public class ThreadTest{

      public static void main(String args[]){

        Thread t1 = new SimpleThread("Runner A");

        Thread t2 = new SimpleThread("Runner B");

        t1.start();

        t2.start();

     }

    }

    _____________________________________________________________________________

    ThreadTest類(lèi)的main()方法中創(chuàng)建了兩個(gè)SimpleThread類(lèi)的線程對(duì)象并調(diào)用線程類(lèi)的start()方法啟動(dòng)線程。構(gòu)造線程時(shí)沒(méi)有指定目標(biāo)對(duì)象,所以線程啟動(dòng)后執(zhí)行本類(lèi)的run()方法。

    注意,實(shí)際上ThreadTest程序中有三個(gè)線程同時(shí)運(yùn)行,在應(yīng)用程序的main()方法啟動(dòng)時(shí),JVM就創(chuàng)建一個(gè)主線程,在主線程中可以創(chuàng)建其他線程。

      2,實(shí)現(xiàn)Runnable接口創(chuàng)建線程

    可以定義一個(gè)類(lèi)實(shí)現(xiàn)Runnable接口,然后將該類(lèi)對(duì)象作為線程的目標(biāo)對(duì)象。實(shí)現(xiàn)Runnable接口就是實(shí)現(xiàn)run()方法。

    下面程序通過(guò)實(shí)現(xiàn)Runnable接口構(gòu)造線程體。

    程序 ThreadTest.java

    class T1 implements Runnable{

      public void run(){

        for(int i=0;i<15;i++)

          System.out.println("Runner A="+i);

      }

    }

    class T2 implements Runnable{

      public void run(){

        for(int j=0;j<15;j++)

          System.out.println("Runner B="+j);

      }

    }

    public class ThreadTest{

      public static void main(String args[]){

        Thread t1=new Thread(new T1(),"Thread A");

        Thread t2=new Thread(new T2(),"Thread B");

        t1.start();

        t2.start();

      }

    }

    _____________________________________________________________________________




        

     



    posted @ 2011-09-01 20:46 Jamie 閱讀(383) | 評(píng)論 (0)編輯 收藏

    android 項(xiàng)目下文件的作用

    1, R.java 是建立項(xiàng)目時(shí)自動(dòng)生成的,只讀,用來(lái)定義該項(xiàng)目所有資源的索引文件。
    這里面定義了很多常量, 名字與res文件夾的文件名和String.xml里的定義的常量名相同。當(dāng)項(xiàng)目中加入了新的資源時(shí),只需要刷新一下該項(xiàng)目,R.java 便自動(dòng)生成了。
    2, strings.xml 里面定義了字符串資源。 
        在類(lèi)中可通過(guò)如下方式使用這些資源, Resource r = this.getContext().getResources(); String str = ((String) r.getString(R.string.name));
        在main.xml中可以 android:text="@string/name"
    3,  mail.xml 用來(lái)寫(xiě)UI(布局,控件...)
        主程序繼承Activity類(lèi),重寫(xiě)了void onCreate(Bundle savedInstanceState)方法。 在方法里通過(guò)setContentView(R.layout.main)設(shè)置Activity要顯示的布局文件(\layout\main.xml)
    4.  AndroidManifest.xml
        看下默認(rèn)的:

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="      package="com.test"
          android:versionCode="1"
          android:versionName="1.0">
        <uses-sdk android:minSdkVersion="8" />

        <application android:icon="@drawable/icon" android:label="@string/app_name">   //應(yīng)用程序的名字
            <activity android:name=".WuActivity"   //默認(rèn)啟動(dòng)哪個(gè)Activity
                      android:label="@string/app_name">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>

        </application>
    </manifest>

    posted @ 2011-08-24 02:33 Jamie 閱讀(1024) | 評(píng)論 (0)編輯 收藏

    關(guān)于ADT和SDK版本

    用最新的就都用最新的, 不然有可能導(dǎo)致配置過(guò)程中出現(xiàn)一些問(wèn)題。

    我用SDK3.2和ADT 0.9.5配置, 結(jié)果Preferences->Android里設(shè)置路徑出現(xiàn)問(wèn)題。

    posted @ 2011-08-23 17:45 Jamie 閱讀(250) | 評(píng)論 (0)編輯 收藏

    主站蜘蛛池模板: 91免费国产在线观看| 国产99视频免费精品是看6| 亚洲av成人一区二区三区观看在线| 免费人成网站在线高清| 一区二区三区在线免费看| 七次郎成人免费线路视频| 亚洲AV成人无码久久精品老人| 在线观看特色大片免费视频| 日本视频免费观看| 亚洲国产成人在线视频| 亚洲午夜久久久影院| 好大好硬好爽免费视频| 永久免费A∨片在线观看| 亚洲精华国产精华精华液好用 | 杨幂最新免费特级毛片| 18gay台湾男同亚洲男同| 亚洲国产成人精品女人久久久 | 亚洲丁香婷婷综合久久| 亚洲精品国产成人专区| 亚洲成a人片在线观看老师| 5555在线播放免费播放| 一本大道一卡二大卡三卡免费| 亚洲香蕉久久一区二区| 亚洲va无码va在线va天堂| 亚洲va中文字幕无码| 野花高清在线观看免费完整版中文| 国产又黄又爽胸又大免费视频| 亚洲成av人无码亚洲成av人| 亚洲国产精品日韩在线观看| 亚洲中文字幕在线乱码| 国产在线观看免费不卡| 国产无人区码卡二卡三卡免费| 免费播放在线日本感人片| 日本永久免费a∨在线视频| 亚洲综合一区无码精品| 亚洲国产精品成人精品小说| 亚洲AV无码国产在丝袜线观看| 亚洲国产精品尤物yw在线| 国产成人精品高清免费| 精品久久免费视频| 大地资源免费更新在线播放|