2013-07-15 38 views
1

嘿,一个新手来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 
    } 
} 
} 

回答

0

我在这里,我认为可以证明你一个抽象的架构编写的虚拟代码..

public class GCMIntentService extends GCMBaseIntentService{ 
private static ArrayList<Message> messageQueue = new ArrayList<Message>(); 
private static boolean isProcessingMessage = false; 

onMessage(Context context, Intent intent) 
{ 
if(isProcessingMessage) 
    { 
    Message currentMsg = new Message();//Create a instance of message and put it in arrayList 

    } 
    else{ 
     isProcessingMessage = true; 
      for(int i = 0; i < messageQueue.size(); i++) 
      {// Process all your messages in the queue here 
       messageQueue.remove(i); 
       } 
       isProcessingMessage = false; 
     } 
} 

private class Message{ 

//In this class you can configure your message that you are going to queue. 
} 
} 
+0

我不明白你所谓的“线程”与bucle .. – delive

0

首先,onMessage()方法被执行每一次新的GCM消息到达(即使你不进你的应用程序,因为我们注册该接收器到清单文件中)。因此,获取您的活动的上下文会导致您的应用程序崩溃(NullPointerException)。

现在,就您的问题而言,您可以维护一个跟踪传入的GCM消息的队列。并且,在处理消息时,您可以检查队列中的条目并处理它们。为此,您可以使用布尔值来标记是否有任何消息正在处理(标志== true)。当(flag == false)时,你可以从队列中取出下一个条目并处理它。

我希望它有用。

+0

@Abhishek ...如何实现你的建议队列的事情吗?请示例 – Sid

+0

还...如果我无法获得我的mainActivity的上下文,我怎么可以使用runOnUiThread方法? – Sid

+0

@Sid,为此,您可以在您的活动中实现一个监听器。 –

相关问题