我刚刚开始研究在同步过程中遇到一些重大性能问题的Android应用。有一些悬而未决的成果,比如重复insert
而不是bulkInsert
等,但我也注意到日志中的以下内容:
11-25 11:46:02.630 10160-10160/my.package.name:sync D/mlt_SyncService: onCreate()
11-25 11:46:02.630 10160-10160/my.package.name:sync D/mlt_SyncService: Bound
11-25 11:46:02.660 10160-10160/my.package.name:sync D/mlt_SyncService: onCreate()
11-25 11:46:02.660 10160-10160/my.package.name:sync D/mlt_SyncService: Bound
11-25 11:46:02.700 10160-10160/my.package.name:sync D/mlt_SyncService: onCreate()
11-25 11:46:02.700 10160-10160/my.package.name:sync D/mlt_SyncService: Bound
11-25 11:46:02.720 10160-10160/my.package.name:sync D/mlt_SyncService: onCreate()
11-25 11:46:02.720 10160-10160/my.package.name:sync D/mlt_SyncService: Bound
11-25 11:46:02.750 10160-10160/my.package.name:sync D/mlt_SyncService: onCreate()
11-25 11:46:02.750 10160-10160/my.package.name:sync D/mlt_SyncService: Bound
11-25 11:46:02.780 10160-10160/my.package.name:sync D/mlt_SyncService: onCreate()
11-25 11:46:02.780 10160-10160/my.package.name:sync D/mlt_SyncService: Bound
......依此类推...... 这是有问题的服务:
public class SyncService extends Service {
private static final String DEBUG_TAG = "mlt_SyncService";
private static SyncAdapter sSyncAdapter = null;
// Object to use as a thread-safe lock
private static final Object sSyncAdapterLock = new Object();
@Override
public void onCreate() {
synchronized (sSyncAdapterLock) {
if (sSyncAdapter == null) {
sSyncAdapter = new SyncAdapter(getApplicationContext(), true);
}
Log.d(DEBUG_TAG,"onCreate()");
}
}
@Override
public IBinder onBind(Intent intent) {
Log.d(DEBUG_TAG,"Bound");
return sSyncAdapter.getSyncAdapterBinder();
}
}
那里没什么特别的。但是,似乎新的SyncService始终被实例化。我能找到的唯一服务用法是清单:
<service
android:name="my.package.name.sync.SyncService"
android:exported="true"
android:process=":sync">
<intent-filter>
<action android:name="android.content.SyncAdapter" />
</intent-filter>
<meta-data
android:name="android.content.SyncAdapter"
android:resource="@xml/syncadapter" />
</service>
再一次,没有什么特别的。
似乎SyncService
在每个保存的实体上实例化,但是通过该代码并没有发现任何可疑的内容,除了我们正逐一进行insert
的事实一个bulkInsert
,但这是一个不同的故事。此外,即使我放入断点并停止insert
执行,onCreate()
日志流也会继续。
我认为可能有内容观察者会在更改时触发新的同步,但并非如此。只有一个requestSync
电话;在onClick
听众中。
那么,为什么我的SyncService会在同步过程中一直被实例化并绑定?
感谢任何想法。