我创建了2个应用程序,一个客户端和一个服务器应用程序。当使用客户端应用的人在RDB上写东西时,这会在运行服务器应用的电话上触发一些事件,然后当服务器完成客户端所请求的操作时从RDB中删除。
每个应用程序都执行其操作(客户端写入和服务器删除条目),问题在电话不活动后出现,为了完成写入和删除操作,我需要关闭并打开wifi /移动数据连接。
下面有一个代码片段,该片段显示服务器应用程序如何尝试与Firebase RDB通信以删除客户端编写的条目,这种情况每次在服务器应用程序上结束通话时都会发生。顺便说一句,确实调用了onReceive方法,并且我认为此问题与此代码实现无关,因为我已经尝试了许多不同的方法来解决此问题,但均未成功。
public class CallStateReceiver extends BroadcastReceiver {
public static String prevState = TelephonyManager.EXTRA_STATE_IDLE;
private final String LOG_TAG = "CallStateReceiver";
@Override
public void onReceive(Context context, Intent intent) {
final PendingResult pendingResult = goAsync();
Task asyncTask = new Task(pendingResult, intent, context);
asyncTask.execute();
}
private static class Task extends AsyncTask {
private final PendingResult pendingResult;
private final Intent intent;
String PREFS_NAME = "MyPrefsFile";
SharedPreferences serverInfoPrefs;
String serverName;
AudioManager audioManager;
private Task(PendingResult pendingResult, Intent intent, Context context) {
this.pendingResult = pendingResult;
this.intent = intent;
serverInfoPrefs = context. getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE);
audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
}
@Override
protected void onPostExecute(Object o) {
super.onPostExecute(o);
pendingResult.finish();
}
@Override
protected Object doInBackground(Object[] objects) {
Bundle bundle = intent.getExtras();
if (bundle == null) {
return null;
}
serverName = serverInfoPrefs.getString("serverName", "Servidor1");
String state = bundle.getString(TelephonyManager.EXTRA_STATE);
if (state.equalsIgnoreCase(TelephonyManager.EXTRA_STATE_IDLE)
&& !prevState.equalsIgnoreCase(TelephonyManager.EXTRA_STATE_IDLE)) {
FirebaseDatabase.getInstance().getReference().child("servers").child(serverName).child("current")
.child("callRequest").removeValue();
audioManager.setStreamVolume(AudioManager.STREAM_VOICE_CALL, 5, 0);
MyAccessibilityService.onCallAlready = false;
}
prevState = state;
return null;
}
}
}
我启用了调试日志记录和这一行(虽然不确定这是否与问题有关):
03-02 18:08:55.360 10832-10840/? W/SQLiteConnectionPool: A SQLiteConnection object for database '/data/data/com.google.android.gsf/databases/gservices.db' was leaked! Please fix your application to end transactions in progress properly and to close the database when it is no longer needed.
还找到了this解决方案,但我不知道这对Firebase有何作用