2011-07-20 49 views
0

我有一個問題:我想用幾個活性及服務(在額外的過程)靜態對象不幸的是,服務沒有得到活動和副對象。 。反之亦然 我儘量簡化,我覺得是我的代碼樣本中的問題:在活動不是從服務:(accessable靜態對象

活動 「主」:

public static myObject o1; 
public static myObject o2; 

public void onCreate(Bundle savedInstanceState) { 
    o1 = new myObject("someParameter"); 
} 

服務 「爲myService」:

private myObject o1; 
private myObject o2; 

public void onCreate() { 
    this.o1 = main.o1; 
    this.o2 = main.o2; 

    this.o2 = new myObject("someOtherParameter"); 
} 

現在的問題:主要用於活動(以及其他所有活動費)O2總是空(雖然設置與服務)。 對於服務O1總是空(雖然在主要設置):( 但是,如果我的理解Java的對象正確此應該不是這樣的,對嗎?

任何想法是哪裏的問題可能是什麼?

+0

你什麼時候開始你的服務和你的活動。你確定活動是在服務之前開始的嗎? –

+0

這不是一個很好的做事方式。我沒有針對你的具體答案,但你應該直接通過方法傳遞對象。 –

+0

也很小心你在做什麼。靜態成員可能導致應用程序中的內存泄漏 - 有關更多信息,請查看http://developer.android.com/resources/articles/avoiding-memory-leaks.html –

回答

0

可以添加修改靜態到O1,從服務類O2,但是你爲什麼要打副本,你可以使用直接從主的人?在Android中使用靜態對象有助於緩存和好,讓他們只在一類

0

,這是失敗的原因是因爲你設置this.o2到一個新的對象引用。在這個程序中你有四個引用和兩個對象。

main.o1 -> OBJECT1 
main.o2 -> NULL 

在程序開始時。

在線this.o2 = main.o2,您將this.o2設置爲參考main.o2。所以,現在你有:

this.o2 -> main.o2 -> NULL 

在線this.o2 = new myObject("Something");this.o2現在引用新對象的全部在一起。這使您:

this.o2 -> OBJECT2 
main.o2 -> NULL 

更改最後一行main.o2 -> new myObject("Something");你會得到:

this.o2 -> main.o2 -> OBJECT2 

請注意,這是所有認爲是不好的編程習慣。你永遠不想改變一個類的靜態變量。另外,在Android中,您通常不希望像這樣直接訪問活動的調用。

0

正如DeeV所說,使用這種靜態方法並不是很好的做法,但如果你需要絕對必須這樣做,那麼將它們放入Application類中就會在一定程度上包含混亂。

從上下文派生的類(例如Service和Activity)支持您必須轉換爲應用程序類訪問變量的getApplication()或getApplicationContext()方法。

public class MyApplication extends Application { 
     public static myObject o1; 
     public static myObject o2; 
} 

public class MyActivity extends Activity { 
     public void onCreate(Bundle state) { 
       myObject o1 = ((MyApplication) getApplication()).o1; 
       } 
} 

public class MyService extends Service { 
     public void onCreate(Bundle state) { 
       myObject o2 = ((MyApplication) getApplication()).o2; 
       } 
} 

請記住,您將不得不同步訪問來自不同線程的變量。

0

的問題是不是與Java,但與Android。 Android不允許你訪問不同進程的變量。只需從清單文件中的服務中刪除android:process屬性即可讓服務在您的活動正在運行的同一個進程中運行。