我有一些应用程序包含一些活动。这些活动需要公共资源(矩阵数组列表),因此为了避免多次重新加载这些资源(当更改为另一个活动或更改方向时),我已经创建了一个服务。
首先我用 startService(Intent)来调用它,让它变粘。 之后,我将服务绑定到活动, bindService(sIntent,mConnection,BIND_AUTO_CREATE);
最后,我有一些代码尝试从服务中获取数据,但它会生成NullPointerException。我知道这是因为(正如我在日志中看到的)服务在应用程序崩溃后启动,尽管我在访问数据代码之前放了 startService 和 bindService 。
任何人都知道如何在尝试访问数据之前确保加载数据?
提前致谢。
答案 0 :(得分:2)
您可能更容易在SharedPreference中保存公共资源,SharedPreference可由应用程序的所有线程访问,并且在运行之间是持久的。这取决于您的资源。
如果您希望自己的服务适用于您的方法you could do this with a transparent Activity。 AsyncTask可能是一个更简单,更简单的解决方案。
尝试使用AsyncTask加载您的数据,您可以选择加载时活动所做的任何内容(进度对话框?),并确保使用后的数据继续使用您的应用>当您的AsyncTask调用ready方法(onPostExecute()
)时。这意味着AsyncTask将把您的服务理念替换为后台线程,管理您的资源。 (加载,下载等)。
下次发布您的日志时,他们可能会提供帮助。
答案 1 :(得分:1)
在扩展onCreate()的班级的Application中启动您的服务。或者更好的是,在Application类中执行Service所做的工作,保证在应用程序的任何其他部分之前创建。服务可能需要一段时间才能启动,您可能会遇到竞争条件,但扩展应用程序的类总是要启动的应用程序的第一部分。
答案 2 :(得分:0)
我最近遇到了这个问题并创建了一个解决方案。类似于无形活动,但想法是创建一个" loading"不需要服务的活动。这是一个例子:
在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 /示例/ 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。