所以我在一个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() 方法。
谢谢大家的回复。