![](/img/trans.png)
[英]ForegroundService sometimes doesn't start immediately, but starts after minutes Android
[英]Android thread sometimes doesn't start
所以我在一個Android項目中遇到了線程問題。 我有一個帶有BuildScreen()函數的ThreadStarter類,它實際上為每個活動創建布局。 唯一的問題是,有時線程不會啟動,我也不知道為什么。 盡管它們在98%的時間內都能正常工作,但是如果不這樣做,當前活動將永遠不會啟動,並且用戶必須重新啟動應用程序,這很不方便。
這是我的代碼片段:
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線程,因為它幾乎相同,只是它調用了另一個函數。
這就是創建每個活動的方式(當然,每個文件的contentView都不相同):
@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()方法。
感謝大家的答復。
嘗試將其添加到您聲明了全局變量的類中
private static ListInitialiser instance;
public static synchronized ListInitialiser getInstance() {
if (instance == null)
instance = new ListInitialiser();
return instance;
}
每次您在使用static時都不必創建新文件。我不知道,但這可能會有所幫助
您不能依賴靜態變量,因為只要系統需要內存,Android中的所有靜態(非最終)內容都可以清除。 因此,不要以為靜態=存儲。
相反,應在需要它們時實例化對象,如下所示:
public static ScreenDrawer getScreenDrawer() {
return new ScreenDrawer();
}
public static ListInitialiser getListInitialiser () {
return new ListInitialiser ();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.