2013-02-20 73 views
1

我有一个应用程序与一些活动。这些活动需要共同的资源(矩阵arrayLists),所以为了避免重新加载这些资源(当改变到另一个活动或者改变方向时),我创建了一个服务。确保服务在活动部分之前执行

首先我打电话给startService(意图)让它变得粘稠。 之后,我将服务绑定到活动,bindService(sIntent,mConnection,BIND_AUTO_CREATE);

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

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

在此先感谢。

回答

1

在延伸Application的课程的onCreate()中开始您的服务。或者甚至更好,请执行服务在您的应用程序类中执行的工作,该应用程序类可保证在应用程序的任何其他部分之前创建。服务可能需要一段时间才能启动,并且您可能会遇到竞争状况,但扩展应用程序的类是总是要启动的应用程序的第一部分。

+0

问题是我需要一个服务或一些托管数据的地方,我可以访问的地方。如果我把我的服务在Application类的onCreate()上做了什么,我怎么能从我的活动引用加载的数据? – user1205781 2013-02-21 00:13:35

2

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

如果你想让你的服务为你的方法you could do this with a transparent Activity工作。尽管如此,AsyncTask可能是一个更简单更简单的解决方案。

尝试与AsyncTask加载数据,你可以选择任何你想要的,同时加载(进度对话框?)的活动做什么,并确保你使用你的数据继续你的应用程序后,当您的AsyncTask调用准备方法(onPostExecute())。这意味着AsyncTask会将您的服务想法替换为后台线程,管理您的资源。 (加载,下载等)。

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

+0

感谢您的回答,但我想分享的对象不是原始数据,因此我无法使用共享首选项。 – user1205781 2013-02-20 23:58:42

+0

然后通过透明活动启动您的服务或使用asynctask。我在答案中提供了一个链接。祝你好运! – Timmetje 2013-02-21 09:16:55

+0

我想我会在你的答案和拉格哈夫之间做一个混合。所以我会尝试从Application类启动一个异步任务,这个任务也将作为一个资源持有者(我不知道是否有可能......)。 – user1205781 2013-02-21 18:53:13

0

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

在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。

相关问题