嘿,一個新手來android編程和我正在這個項目上工作。 這個問題很長,所以這裏就是交易。在其他線程上執行方法的同步
我有延長GCMBaseIntentService
這個GCMIntentService類和當消息從服務器到達時,GCMBroadcastReceiver
可自動識別並調用GCMIntentService類重寫onMessage()
方法。現在在onMessage
正文中,我正在對SQLiteDatabase
執行一些操作,並且我正在通過在onMessage主體內的ui線程中調用adapter.notifyDataSetChanged()
來通知我的適配器進行列表視圖。
現在,如果超過2或3 gcm的消息同時傳到設備,應用程序會崩潰,因爲多個線程正在調用相同的onMessage()
方法,並且正在搞亂我的數據庫和適配器。我想我需要在一次只能由一個線程使用的方法上使用synchronized關鍵字。
但自從我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
}
}
}
我不明白你所謂的「線程」與bucle .. – delive