我正在我的Android应用程序中使用 Realm。我通过完成事件收到来自谷歌驱动器的通知,所以我需要在服务中修改我的领域数据库。
我得到的例外是:
java.lang.IllegalStateException: Realm access from incorrect thread. Realm objects can only be accessed on the thread they were created.
我在应用程序类中设置了默认配置,如下所示:
RealmConfiguration realmConfiguration = new RealmConfiguration.Builder(getApplicationContext())
.deleteRealmIfMigrationNeeded()
.build();
Realm.setDefaultConfiguration(realmConfiguration);
在onCreate中,我从我的服务中得到我的领域实例,如下所示:
mRealm = Realm.getDefaultInstance();
然后我在服务中使用这个领域实例:
mRealm.executeTransaction(realm -> {
DocumentFileRealm documentFileRealm = realm.where(DocumentFileRealm.class)
.equalTo("id", documentFileId)
.findFirst();
documentFileRealm.setDriveId(driveId);
});
但是,在执行最后一个时,应用程序会启动非法状态异常。我不知道为什么。我不确定它是否与我在Android清单中声明服务的方式有关,所以我把它留在这里:
<service android:name=".package.UploadCompletionService" android:exported="true">
<intent-filter>
<action android:name="com.google.android.gms.drive.events.HANDLE_EVENT"/>
</intent-filter>
</service>
有可能从后台服务调用Realm吗?我使用它的方式有什么问题吗?
提前谢谢。
在 IntentService 中,您应该将 onHandleIntent
方法视为异步任务的 doInBackground
方法。
因此它在后台线程上运行,您应该确保在finally块中关闭Realm。
public class PollingService extends IntentService {
@Override
public void onHandleIntent(Intent intent) {
Realm realm = null;
try {
realm = Realm.getDefaultInstance();
// go do some network calls/etc and get some data
realm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
realm.createAllFromJson(Customer.class, customerApi.getCustomers()); // Save a bunch of new Customer objects
}
});
} finally {
if(realm != null) {
realm.close();
}
}
}
// ...
}
< code>onCreate运行在UI线程上,因此您的领域初始化发生在不同的线程上,这是不可行的。
问题内容: 如何在不显示通知点的情况下继续在Android Oreo中进行后台服务?我使用通知继续后台服务,但我不想显示正在运行的服务的通知。 问题答案: 如果您可以在此处的某处正确阅读 Android Oreo 8.0 文档,则可能未在此处发布此问题。 步骤1: 确保您将服务作为前台启动,如以下代码所示 步骤2: 使用通知显示您的服务正在运行。在的方法中的代码下面添加一行。 步骤3:在服务停止或
如何在Android奥利奥继续后台服务而不显示通知点?我使用通知继续我的后台服务,但我不想显示运行服务的通知。
我想创建一个小应用程序,在后台记录数据。所以我试着用绑定服务。这很好,但如果我关闭应用程序,服务也会停止。< br >那么,我的问题是:使用即时服务来执行这一操作是不是一个好方法?当应用程序关闭时,我如何保持服务在后台运行(我也想在启动后启动它)?
问题内容: 哪种方法更好,直接像这样执行 或通常在类内部声明? 问题答案: 在第二段代码中,必须在调用接口的方法之前先调用属性。 在第一段代码中,您可以直接访问接口方法。 因此,如果您知道每个方法调用都会花费cpu时间,则直接在类中实现它而不是将其作为属性将是有益的。 在这种情况下,您有1个引用,可以使用该引用访问LocationListener的方法 在这种情况下,您有2个引用,一个是 Back
我已经安装了一个XMPP服务器,并在android上使用smack做了一个客户端应用程序,一切都很好,但我正在更新的手机上测试应用程序,它不再工作了。 Android杀死了等待消息的服务(当用户关闭应用程序时杀死服务),我一直在读,人们说我应该使用FCM,但我想使用我自己的消息服务器,因为我在XMPP服务器上添加了一些特殊的用户管理逻辑。我不知道我是否可以使用FCM sdk来获取我自己的消息并从那
问题内容: 我一直在为Android开发一个包含后台服务的PhoneGap应用程序。我的问题是:如何调试此服务?是否可以使用AVD进行调试并逐步进行?还是可以使用自己的设备来实现? 谢谢! 问题答案: 是的,可以使用AVD或设备来完成。查看http://www.helloandroid.com/tutorials/how-debug- service 和调试服务。