1. 程式人生 > >在run方法中使用static成員變數問題

在run方法中使用static成員變數問題

         最近在寫一個藍芽的測試程式,裡面定義了一個CommunicateThread 連線執行緒類繼承於Thread;在該類中定義了一個run方法。run方法程式碼如下:

public void run() {
        byte[] buffer;//用於讀資料的快取區
        int size;//長度
        String data;//資料
        while (isRunning && isOverCount) {
            try {

                //System.out.println("isOverTime:"+" "+isOverTime);
                if (in != null) {
                    size = in.available();
                    //有資料就去拿出來
                    if (size > 0) {
                        buffer = new byte[size];
                        in.read(buffer);
                        data = new String(buffer);
                        //能過Handler把資料傳出去
                        Message msg = mHandler.obtainMessage();
                        msg.what = BluetoothConstant.WHAT_RECEIVED_DATA;
                        msg.obj = data;
                        mHandler.sendMessage(msg);
                    }
                }
            } catch (IOException e) {
                //e.printStackTrace();
                isRunning = false;
                System.out.println("Error-CommunicateThread:run()");
            }
        }
    }

        本人的目的就是想通過其他類設定一個static成員變數來控制while()裡面的迴圈標誌位。無論我用什麼方法都不能控制這個標誌位;即在Communication類中的這個標誌位與我一開始定義的那個標誌有差別。這就是我要寫這篇部落格的原因了。

         通常,static成員變數在建立時只分配一次記憶體,它作用於全域性範圍,由類名直接呼叫。當我把static標誌位在一個Fragment定義後,然後在while()裡面呼叫Fragment.標誌位;發現結果與我想象中的不一樣。但在fragment裡面該值已經變化了;也就是說run方法中這個值與Fragment中的值不同時變化。這就與我們所理解的static只分配一次記憶體的想法背向而馳。這期間我也在網上查找了一些資料,然而並沒有查到什麼結果。我們只能猜測在run方法中,該標誌位被重新拷貝了一份。

        當然,出現這樣的問題也是因為我在寫程式想偷懶,或許我的想法比較奇特。正常的寫法應該是在Communication類中定義一個Close()方法,在close()方法中令isRunning設定為false。然後在例項化Communication類的類中再呼叫Close()方法;這樣就能控制標誌位了。

         如果有知道導致該問題原因的大牛們,請留言告知,非常感謝了!

         另附上正常寫法:

public void close() {
        if (mCommunicateThread != null) {
            mCommunicateThread.close();
        }
        try {
            if (mBluetoothSocket != null) {
                mBluetoothSocket.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
        這個close()方法是在Communication類例項化類中的方法。通過呼叫該方法就能控制了!

相關推薦

static成員變數定義和宣告

類中static成員變數的定義和宣告:在VS2010中,只能在類外定義同時賦值,在類中宣告。不能再類中宣告時賦值!! #include<iostream> using namespace std; class A { public: static int a

run方法使用static成員變數問題

         最近在寫一個藍芽的測試程式,裡面定義了一個CommunicateThread 連線執行緒類繼承於Thread;在該類中定義了一個run方法。run方法程式碼如下: public void run() { byte[] buffer;//用於

static方法,不能訪問類內非static成員變數方法

因為我們知道靜態的方法可以在沒有建立例項時使用,而申明為非靜態的成員變數是一個物件屬性,它只有在物件存在時引用,因此如果在物件未建立例項時我們在靜態方法中呼叫了非靜態成員方法自然是非法的,所以編譯器會

Java的null物件也可以訪問static成員變數方法

      一般來說,一個類的物件要在例項化之後才可以訪問類中的成員變數和方法。如果它還是null,通常意義上我們就認為它不能訪問類中的成員。實際上確實不提倡這樣,而且null物件確實不能訪問例項成員(變數和方法),否則會引發NULLPointerException錯誤。

Javastatic(靜態變數/方法)的優缺點

static關鍵字宣告的變數或方法稱為靜態變數/方法 靜態static變數/方法在類載入的過程中被初始化,在記憶體中只存在一份,所以可以把它當作是全域性變數/方法。 優點 屬於類級別的,不需要建立物件就可以直接使用. 全域性唯一,記憶體中唯一,靜態變數

同一個包,同一個類成員變數成員方法的呼叫!

分析範圍:/**同一個包,同一個類中: * 注意:eat1與eat2是方法的過載(方法名相同,引數列表不同與返回值型別無關) * 在同一個.java檔案中可以寫多個類,但是隻能有一個public修飾的類 * 同一個類中同類型的(靜態與非靜態)方法之間可以相互呼叫,例如eat()與sleep(); * 方法1

繼承成員變數方法區域性變數關係

public class Test {     public static void main(String[] args) {         Son son = new Son();         son.f();              } } class Fath

C++:static成員變數方法

static 修飾成員變數 和方法 static 修飾成員變數 不屬於物件私有 ,屬於物件共享 ,一定要在類外進行初始化。 #include<iostream> using namespace std; class Test { public: Test(int a, i

C++常規變數、const、staticstatic const(const static)成員變數的宣告和初始化

C++類有幾種型別的資料成員:普通型別、常量(const)、靜態(static)、靜態常量(static const)。這裡分別探討以下他們在C++11之前和之後的初始化方式。 c++11之前版本的初始化 在C++11之前常規的資料成員變數只能在建構函式

java 類初始化,構造方法,靜態成員變數,靜態塊的載入順序

1、編譯和執行概念要搞清:編譯即javac的過程,負責將.java檔案compile成.class檔案,主要是型別、格式檢查與編譯成位元組碼檔案,而載入是指java *的過程,將.class檔案載入到記憶體中去解釋執行,即執行的時候才會有載入一說。 2、類的載

【Java基礎知識】Java介面成員變數為何必須是public static final

一、Java介面中的成員變數為何必須是public static final 介面中的成員變數只有一種型別,public static final ,所以可以直接省去修飾符。 為什麼介面的變數修飾符必須是public static final 型別呢? ①

解析面試題-介面成員變數為什麼要定義成public static final

這是哥們在看面試題時問我的,有人說這樣的問題沒有意義,也有人說這樣的問題只要具備夯實的基礎就會戳破這個紙老虎 先說下這個問題吧 為什麼要把介面中的成員變數定義為public static final 首先看下介面的定義: 介面是從多個相似類中抽象出來的規範,介面不提供任何實

MFC執行緒函式訪問成員變數方法

用AfxBeginThread啟動執行緒,執行緒的執行函式有兩種定義的方法: 全域性函式:UINT threadMessageBoxAdapter( LPVOID lParam ); 靜態成員函式:static UINT threadMessageBoxAdapter( L

為什麼java介面成員變數必須被static關鍵字和final關鍵字修飾

對待這個問題,我建議用辯證的角度去看待!首先我們來看只有final沒有static的情況,也就是說每個實現類裡面都會有一個名字和值都一樣的變數(final強調不準改變引用地址),那麼在初始化相關實現類

Java介面成員變數為什麼必須宣告為public static final?

一、為什麼要用final? 首先,我們應該明白一個問題。介面,實際上比抽象類更加抽象,它是最高層次的抽象。介面中的所有方法都是抽象方法,不會有任何實現方面的程式碼,而它的具體實現是要靠實現這個介面的具體類來具體實現的。而且,這個介面中的方法是不可更改的。同樣的,介面中的

java對類成員變數成員方法的封裝及private關鍵字

package org.westos_05_封裝和private; /*  * private:  * 私有的,不可訪問的!  * 可以修飾成員變數,也可以修飾成員方法  * 特點:被private修飾的成員只能在本類中訪問,那麼需要提供公共訪問方法  * */ class

有關C++類資料成員變數定義的一些想法

最近開始學習C++,以前是學C的,對C++新生的類不是很懂,最近在看一些教程,發現有的教程只是簡單的告訴你什麼是類,還有怎麼使用類,但對於類的標準啥的並沒有進行標準化的介紹。 關於C++類中成員變數的定義,一般都是推薦這樣定義: 1.類中的屬性(不是函式)最好定義標準化,並且取名字能讓其

繼承子父類成員變數的記憶體圖解

程式碼 class Fu { int num = 4; } class Zi extends Fu { int num = 5; void show() { System.out.print(this.num+"..."+super.num); } } class Exte

5.5 匿名方法的捕獲變數

class Program { static void Main(string[] args) { MethodInvoker m = CreateInvoker(); m();

靜態方法可以呼叫成員變數嗎?

static是類級別方法 也就是可以 類名.方法呼叫 不加static是例項級別的 也就是必須 先有例項(物件) 才能呼叫其方法如new A().test()  不行,因為java中靜態的東西是類級別的,也就是說用類名就可訪問,也可以用任何物件名訪問,無論以哪種形式訪問的都是