2012-12-05 117 views
2

因此,我在Android項目中遇到了線程問題。我有一個ThreadStarter類,它帶有一個BuildScreen()函數,它實際上爲每個活動創建佈局。唯一的問題是,有時線程不會啓動,我不知道爲什麼。儘管他們的工作時間爲98%,但如果他們不這樣做,目前的活動將永遠不會起作用,用戶必須重新啓動應用程序,這是不方便的。Android線程有時無法啓動

這裏是我的代碼片段:

public class ThreadStarter 
{ 
    public static void BuildScreen() 
    { 
     try 
     { 
      GlobalVariables.screenDrawer.onStart(); 
      GlobalVariables.listInitaliser.onStart(); 
      Logger.log("ThreadStarter.BuildScreen", "Threads started"); 
     } 
     catch(IllegalThreadStateException e) 
     { 
      GlobalVariables.screenDrawer.StopThread(); 
      GlobalVariables.listInitaliser.StopThread(); 
      Logger.log("ThreadStarter.BuildScreen", "Threads stopped"); 

      GlobalVariables.screenDrawer.onStart(); 
      GlobalVariables.listInitaliser.onStart(); 
     } 
     catch(Exception e) 
     { 
      Logger.Error("Couldn't stop or start the threads!"); 
      Logger.Error("Exception() Message: " + e.getMessage()); 
     } 
    } 
} 

螺紋:

public class ListInitialiser extends Thread 
{ 
    private static ListInitialiser _thread; 
    public synchronized void run() 
    { 
     GlobalVariables.CurrentActivity.UpdateLists(); 

    } 

    public void onStart() 
    { 
     _thread = new ListInitialiser(); 
     _thread.start(); 
    } 

    public void StopThread() 
    { 
     if (_thread != null) 
     { 
      _thread.interrupt(); 
      _thread = null; 
     } 
    } 

} 

我不會在這裏插入ScreenDrawer線程,因爲這幾乎是一樣的,只不過它調用另一個功能。

這是怎麼每次活動創建(當然內容查看每個文件不同):

@Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     getWindow().getAttributes().windowAnimations = R.style.Fade; 
     setContentView(R.layout.activity_fine_data_3); 
     GlobalVariables.CurrentActivity = this; 
     ThreadStarter.BuildScreen(); 
     Logger.log("INFORMATION", "Person3DataActivity (Information 3/5)"); 
    } 

在GlobalVariables部分,我有這些變量:

public static ScreenDrawer screenDrawer = new ScreenDrawer(); 
public static ListInitialiser listInitaliser = new ListInitialiser(); 

如果任何人有解決方案或想法,請與我分享。 在此先感謝。


編輯:好的,所以我把ONOF的(相當嚴厲,但有用的:))的意見,並重構我的代碼使用的AsyncTask代替。它似乎工作得很好。我設法將它實現到我的AbstractActivity類中,該類是我使用的每個Activity的父項,現在我所要做的就是在每個onCreate方法中調用BuildScreen()方法。

感謝大家的回覆。

+0

那樣的做法似乎很奇怪,我。爲什麼你需要這樣初始化你的活動? –

+0

我有很多活動,我不得不找到一個標準的解決方案來初始化它們,而不用重複我的大部分代碼。這似乎工作得很好。另外,我的一些活動需要使用大量資源(如圖片),因此我需要在後臺加載它們,以保持GUI的響應。 – Rockbag

+0

什麼不是初始化?您的活動或其從未去過ListInitialiser類? – sheetal

回答

1

嘗試將此添加到您的類,其中u聲明全局變量

private static ListInitialiser instance; 
public static synchronized ListInitialiser getInstance() { 
    if (instance == null) 
     instance = new ListInitialiser(); 
    return instance; 
} 

你DONOT必須創建新的回合時採取static.I不知道,但可能是每次這樣可以幫助

0

你可以不需要依賴靜態變量,因爲在系統需要內存時,可以清除Android中靜態(非最終)的所有內容。所以不要以爲static = storage。

當你需要它們,就像下面而應該實例化對象:

public static ScreenDrawer getScreenDrawer() { 
    return new ScreenDrawer(); 
} 

public static ListInitialiser getListInitialiser() { 
    return new ListInitialiser(); 
}