2

所以我在一个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() 方法。

谢谢大家的回复。

4

2 回答 2

1

尝试将此添加到您声明全局变量的类中

private static ListInitialiser instance;
public static synchronized ListInitialiser getInstance() {
    if (instance == null)
        instance = new ListInitialiser();
    return instance;
}

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

于 2012-12-05T09:57:33.473 回答
0

您不能依赖静态变量,因为 Android 中的所有静态(非最终)都可以在系统需要内存时被清除。所以不要认为静态=存储。

您应该在需要时实例化对象,如下所示:

public static ScreenDrawer getScreenDrawer() {
    return new ScreenDrawer();
}

public static ListInitialiser getListInitialiser () {
    return new ListInitialiser ();
}
于 2012-12-05T10:08:18.183 回答