Android线程有时无法启动

时间:2012-12-05 09:38:50

标签: java android multithreading

所以我在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();

如果有人有解决方案或想法,请与我分享。 提前谢谢。


编辑:好的,所以我接受了onof(相当苛刻但有用:)的建议,并重构了我的代码以改为使用AsyncTask。它看起来工作得很好。我设法将它实现到我的AbstractActivity类中,它是我使用的每个Activity的父级,现在我所要做的就是在每个onCreate方法中调用BuildScreen()方法。

感谢大家的回复。

2 个答案:

答案 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 ();
}