簡體   English   中英

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM