嘿,我是 android 编程的新手,我正在做这个项目。这个问题很长,所以这里是交易。
我扩展了这个 GCMIntentService 类GCMBaseIntentService
,每当有消息从服务器到达时,它都会GCMBroadcastReceiver
自动识别它并调用onMessage()
GCMIntentService 类中的覆盖方法。现在在onMessage
正文中,我正在对 进行一些操作,并通过在 onMessage 正文内的 ui 线程中SQLiteDatabase
调用 来通知我的适配器以进行列表视图。adapter.notifyDataSetChanged()
现在,如果超过 2 或 3 条 gcm 消息同时发送到设备,则应用程序崩溃,因为多个线程正在调用相同的onMessage()
方法,并且也弄乱了我的数据库和适配器。我想我需要在一次只能由一个线程使用的方法上使用同步关键字。
但由于我的onMessage
方法是一个被覆盖的方法,我决定创建另一个方法并在其上放置同步修饰符,但我需要再次runOnUiThread()
从它内部调用该方法,因为我需要通知对我的列表视图适配器的更改。
我只想问这样做是否是正确的方法,或者是否可以使用更简单的解决方案来解决我的问题?
这是 m 所做的示例代码:
@Override
protected void onMessage(Context arg0, Intent intent) {
// called when a new cloud message has been received
Log.w("Service ", "Started");
dbh = new DatabaseHandler(this);
sld = dbh.getWritableDatabase();
who = this;
// processing json object
putDataFromJSON();
//other stuff
}
synchronized private void putDataFromJSON(){
//do some work on JSON Object
//complete work on JSON by putting in database
dbh.saveInDB();
//notify the adapter
((MainActivity) MainActivity.con).runOnUiThread(new Runnable() {
@Override
public void run() {
adapter.notifyDataSetChanged();
//do other stuffs as well
}
}
}