所以我在Android项目中遇到了线程问题。我有一个ThreadStarter类,带有BuildScreen()函数,它实际上为每个活动创建了布局。唯一的问题是,有时线程不会启动,我不知道为什么。它们的工作时间有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();
如果有人有解决方案或想法,请与我分享。 提前谢谢。
感谢大家的回复。
答案 0 :(得分:1)
尝试将此添加到您声明为Global Variables
的类中private static ListInitialiser instance;
public static synchronized ListInitialiser getInstance() {
if (instance == null)
instance = new ListInitialiser();
return instance;
}
每当你采取静电时你不必创造新的东西。我不知道,但这可能会有所帮助
答案 1 :(得分:0)
您不能依赖静态变量,因为Android中的所有静态(非最终)都可以在系统需要内存时清除。所以不要认为static = storage。
您应该在需要时实例化对象,如下所示:
public static ScreenDrawer getScreenDrawer() {
return new ScreenDrawer();
}
public static ListInitialiser getListInitialiser () {
return new ListInitialiser ();
}