2012-04-09 66 views
0

我在Android java項目中有一個主類,其中定義了所有函數。然後我有兩個其他類擴展主類並實現RunnableWindows已經聚焦 - 忽略多線程後的焦點增益

  • 主類:所有主要功能
  • 類2:我使用所有主要功能和具有靜態變量X我在文件修改2.
  • 類3:我使用所有主要功能,並且具有靜態變量Y我在文件3中修改。

在主類中,我啓動2個線程:一個用於Class2,一個用於Class3。

當我嘗試從主類調用Class2.X時,無論如何總是null。我試過volatile,synchronized(thread),getvalue()等,但它不起作用。

我應該怎樣做才能讀取Class2.X的值,使其不在主類中爲空?

下面是代碼:

Thread t = new Thread(new Functionss(mRgbImage)); 
t.start(); 
Thread t2 = new Thread(new Functionss_2(mRgbImage)); 
t2.start(); 

if(boolean_variable) 
{ 
    try { 
     Thread.sleep(30000); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 

    Bitmap final_added =addition(mRgbImage2, mRgbImage3);     
    mImageView.setImageBitmap(final_added); 

mRgbImage2mRgbImage3static volatile變量。

事實上,我認爲這不是一個變量的問題,因爲當我在主類中使用圖像並修改它,然後執行mImageView.setImageBitmap(initial_image)我仍然在我的android手機上出現黑屏。

我注意到在logcat中的以下內容:

Window already focused, ignoring focus gain of: [email protected] 

如果我刪除線程,我沒有得到這個錯誤。

任何幫助?

+2

你能告訴我們一些代碼嗎?你能否爲有問題的字段顯示你的定義?當我認爲你的意思是「課堂」時,你使用「文件」這個詞,對吧? – Gray 2012-04-09 20:43:58

+0

是的每個文件都定義了一個類。 – Adroidist 2012-04-09 20:49:14

+0

可以'boolean_variable'爲'false'?應該是一個時間循環或什麼的。 while(!boolean_variable){sleep(1000); ''或者什麼? – Gray 2012-04-09 22:36:41

回答

1

我懷疑你的線程永遠不會執行賦值語句或正在分配不同的值或其他值。也許可以寫一些日誌消息或調試你的應用程序,並在分配中設置一個斷點。

如果你有這樣的事情:

public class MainClass { 
    Class2 class2 = new Thread(new Class2()); 
    class2.start(); 
    class2.join(); 
    // Class2.value will == 10 here 
} 

,然後:轉讓發生在Class2那麼value已更新,然後後

public class Class2 implements Runnable { 
    public static volatile int value; 
    public void run() { 
     ... 
     this.value = 10; 
     ... 
    } 
} 

。這顯然是一個簡單的例子,我懷疑Class2線程還沒有在你的代碼中實際完成,但只要分配已經完成,那麼value已被更改。日誌消息或調試器再一次在這裏有所幫助。

這將是最好有類似下面的模式:

public class Class2 implements Runnable { 
    private volatile int value; 
    public void run() { 
     ... 
     this.value = 10; 
     ... 
    } 
    public int getValue() { 
     return this.value; 
    } 
} 

所以後來MainClass可以從Class2Class3訪問值而不混亂。請注意,您仍然需要volatile關鍵字,因爲該值是從不同線程獲取/設置的。

希望在這裏有所幫助。如果你用更多的細節編輯你的問題,我可能會幫助更多。

+0

嘿,格雷,我發佈了代碼,它可能不是一個靜態變量的問題,你有什麼想法嗎? – Adroidist 2012-04-09 22:34:31

+0

對不起@Aroidist,我沒有想法。我不認爲你的原始問題是這個問題。你可以調試你的代碼在哪裏顯示圖像或添加日誌消息,看看它是否已經更新? – Gray 2012-04-10 16:51:13

+0

請在下面檢查我的答案 – Adroidist 2012-04-14 18:15:03

0

我用JJIL庫,它在multiiple線程simulatenous(RgbImageJ2se的不同實例)原來,

「 哪些步驟將重現該問題?

  1. 使用RgbImageJ2se.toDisplay。

由於對傳遞的Graphics對象的靜態引用,將會有不確定的結果,具體取決於首先執行哪個線程。 「

參考:http://code.google.com/p/jjil/issues/detail?id=27

我懷疑它是與圖書館,因爲我改寫了與數學函數的代碼,而不是和輸出是正確的。它正在等待兩班完成並使用他們的輸出做進一步的計算。

希望這可以幫助別人卡住。

相關問題