gpt4 book ai didi

java - Android线程有时不启动

转载 作者:行者123 更新时间:2023-11-30 11:38:09 24 4
gpt4 key购买 nike

所以我在 Android 项目中遇到线程问题。我有一个带有 BuildScreen() 函数的 ThreadStarter 类,它实际上为每个 Activity 创建了布局。唯一的问题是,有时线程不会启动,我不知道为什么。尽管它们在 98% 的时间里都可以正常工作,但如果它们不工作,则当前 Activity 将永远不会初始化,用户必须重新启动应用程序,这很不方便。

这是我的代码 fragment :

   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 线程,因为它几乎是一样的,只是它调用了另一个函数。

这就是每个 Activity 的创建方式(当然每个文件的 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;
}

当你使用静态时,每次你都不必创建新的。我不知道,但这可能会有所帮助

关于java - Android线程有时不启动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13720112/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com