1

我正在为我的应用程序从服务器获取数据。“getData”函数包含在应用程序的主 Activity 中,位于启动线程中。我遇到的问题是这样的:

如果我在加载应用程序后快速输入新闻或描述,我注意到并非所有信息都已加载(需要保存的最后 2 或 3 个字符串为空)。但是,如果我在显示主菜单后(完成启动线程后)再允许应用程序几秒钟,则不会发生问题,所有信息都正确存储在手机上。我尝试将启动画面延迟几秒钟,但这并不是一个真正优雅的解决方案,也并不总是有效。

我的问题是如何确保功能在跳转到“最终”之前已经完成

我没有将数据存储在任何数据库中,只是存储在另一个类的公共静态字符串数组中。

您在下面有我的代码:

if(networkAvailable()){
        Thread splashTread = new Thread() {
            @Override
            public void run() {
                try {

                    getData.execute(description_Hyperlinks);
                    getNews.execute(new String[]{newsJSON_Hyperlink});
                    getOffers.execute(new String[]{offersJSON_Hyperlink});

                    for(int i = 0; i<3; i++)
                        Thread.sleep(1000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } finally {
                    finish();
                    startActivity(new Intent(FlexFormActivity.this, MainMenu.class));
                    stop();
                }
            }
        };
        splashTread.start();
4

1 回答 1

2

为了使最初问题的评论中的讨论更具可读性和物理可见性


AsyncTask以-class的形式使用 Android 对异步任务处理的内置支持会是一个更好的主意。这使您可以“参与”任务,让您有机会对进度的不同阶段做出反应。

这个想法不是 makegetData和每个 extend getNews,而是有一个单独的任务(例如,称为“LoadContents”),它一个接一个地加载数据、新闻和报价。getOffersAsyncTask

然后可以确定整个初始工作何时完成,这使得以您可以想象的任何形式对这个“任务完成”做出反应变得容易。


作为一个小的代码审查,通常永远不需要使用Thread-class 本身,因为 Java 和 Android 提供了许多围绕它的包装器(特别是Java Executor Framework),为了产生更干净和可靠的效果,应该受到青睐代码。


此外,作为关于“禁用后退按钮”(@Eugen 使用它来确保启动画面保持存在)的一般建议:要这样做。这不是用户在使用应用程序时所期望的那种行为。

想象一下有人打开了一个应用程序,初始加载内容需要大约 10 秒,并且这个过程无法取消。用户将不得不等待整个时间,然后才离开应用程序而不使用它。

因此,您不应“停用”后退按钮,而应使您的任务(以及因此应用程序的初始加载)“可取消”。使用时AsyncTask,这已经为您实现了。

于 2012-04-07T23:52:46.687 回答