1

我有一个包含一些活动的应用程序。这些活动需要公共资源(矩阵数组列表),因此为了避免多次重新加载这些资源(当更改为另一个活动或方向更改时),我创建了一个服务。

首先,我用startService(Intent)调用它,让它变得粘稠。之后,我将服务绑定到活动, bindService(sIntent, mConnection, BIND_AUTO_CREATE);

最后,我有一些代码尝试从服务中获取数据,但它会生成 NullPointerException。我知道这是因为(正如我在日志中看到的那样)服务在应用程序崩溃后启动,尽管我将startServicebindService放在访问数据代码之前。

任何人都知道如何确保在尝试访问之前获取加载的数据?

提前致谢。

4

3 回答 3

2

将公共资源保存在SharedPreference中可能更容易,SharedPreference 可以被应用程序的所有线程访问,并且在运行之间是持久的。这取决于你的资源是什么。

如果您希望您的服务适用于您的方法,您可以使用透明的 Activity 来做到这一点AsyncTask可能是一个更容易和更简单的解决方案。

尝试使用AsyncTask加载数据,您可以选择 Activity 在加载时执行的任何操作(进度对话框?),并确保在 AsyncTask 调用 ready 方法 ( )继续使用您的应用程序onPostExecute()。这意味着 AsyncTask 将取代您将服务作为后台线程的想法,管理您的资源。(加载、下载等)。

下次还要发布您的日志,它们可能会有所帮助。

于 2013-02-20T13:58:21.867 回答
1

Start your Service in the onCreate() of a class that extends Application. Or even better, do the work the Service is doing in your Application class, which is guaranteed to be created before any other part of your app. A Service may take a while to start up and you may encounter a race condition, but the class extending Application is always the first part of an app to be launched.

于 2013-02-20T13:54:15.100 回答
1

我最近遇到了这个问题并创建了一个解决方案。类似于隐形活动,但想法是创建一个不需要服务的“加载”活动。这是一个例子:

在 AndriodManifest.xml 中:

...
<application
    ... >
    <activity 
        android:name="com.example.LoadingActivity"
        android:label="@string/app_name" >
        <!-- A do-nothing activity that is used as a placeholder while the service is started. -->
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity
        android:name="com.example.MyActivity"
        android:label="@string/app_name" >
        <!-- The real activity, started by the loading activity. -->
    </activity>
    <service
        android:name="com.example.MyService" >
        <!-- The background service, started by the loading activity. -->
    </service>
</application>
...

com/example/LoadingActivity.java:

package com.example;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;

public class LoadingActivity extends Activity
{
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        super.setContentView(R.layout.activity_loading);

        super.startService(new Intent(this, MyService.class)); // listed first so it will start before the activity
        Intent intent = new Intent(this, MyActivity.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); // makes it so the 'loading' activity is not kept on the back-stack
        super.startActivity(intent);
    }
}

MyActivity.java 和 MyService.java 文件只是标准的。您还需要一个activity_loading.xml 布局资源,可能只是一个ImageView。

于 2014-07-16T19:40:28.810 回答