当设备收到GCM IntentService消息时刷新列表视图

当设备收到GCM IntentService消息时刷新列表视图,service,android-listview,google-cloud-messaging,Service,Android Listview,Google Cloud Messaging,我的应用程序能够接收来自GCM的消息,并将消息保存到手机上的SQLlite数据库中。这些消息可在具有listview的活动中查看 在下面的代码中,onPause()函数刷新listView。这不是一个好的实现,因为它仅在更新时未显示活动时才起作用。如果在更新时显示活动,则列表是静态的,不会更新 问题: 如何在显示活动时更新listview?或者,是否有一种方法可以使用后台服务更新适配器,以便在显示活动时始终显示最新数据 这种功能目前在安卓系统中是不可能实现的吗?我还需要实现一些其他功能,比如“拉

我的应用程序能够接收来自GCM的消息,并将消息保存到手机上的SQLlite数据库中。这些消息可在具有listview的活动中查看

在下面的代码中,onPause()函数刷新listView。这不是一个好的实现,因为它仅在更新时未显示活动时才起作用。如果在更新时显示活动,则列表是静态的,不会更新

问题:

  • 如何在显示活动时更新listview?或者,是否有一种方法可以使用后台服务更新适配器,以便在显示活动时始终显示最新数据

  • 这种功能目前在安卓系统中是不可能实现的吗?我还需要实现一些其他功能,比如“拉动刷新”功能

  • 在OnResume()中刷新listview会使应用程序崩溃,并显示空指针异常。

    活动:

    public类NotesView扩展活动实现了mclicklinklistener{
    列表视图列表视图;
    注释适配器objAdapter;
    NotificationsDatabase db=新的NotificationsDatabase(本);
    列表警报;
    弦乐;
    串时间;
    text视图noteView;
    文本视图时间视图;
    @凌驾
    创建时的公共void(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.note);
    listView=(listView)findViewById(R.id.notelist);
    setOnItemClickListener(this);
    noteView=(TextView)findViewById(R.id.noteDisplay);
    timeView=(TextView)findViewById(R.id.notetimeStampDisplay);
    新建MyTask().execute();
    }
    //我的任务开始了。。。
    类MyTask扩展了AsyncTask{
    ProgressDialog;
    @凌驾
    受保护的void onPreExecute(){
    super.onPreExecute();
    pDialog=newprogressdialog(NotesView.this);
    设置消息(“加载…”);
    pDialog.setCancelable(假);
    pDialog.show();
    如果(isCancelled()){
    这个。取消(true);
    }
    }
    @凌驾
    受保护列表doInBackground(无效…参数){
    db.open();
    listAlerts=db.getData();
    如果(isCancelled()){
    这个。取消(true);
    }
    返回null;
    }
    受保护的void onPostExecute(列出警报){
    if(null!=pDialog&&pDialog.isShowing()){
    pDialog.disclose();
    }
    db.close();
    setAdapterToListview();
    }
    }//结束我的任务
    public void setAdapterToListview(){
    objAdapter=newnoteadapter(NotesView.this、R.layout.row\u notes、listAlerts);
    objAdapter.sortByNoteDesc();
    notifyDataSetChanged();
    setAdapter(objAdapter);
    }
    @凌驾
    公共布尔onKeyDown(int-keyCode,KeyEvent事件){
    if(keyCode==KeyEvent.keyCode\u BACK&&event.getRepeatCount()==0){
    意图=新意图(
    NotesView.this.getApplicationContext(),
    tabbare(例如,class);
    意向。额外(“goToTab”、“警报”);
    星触觉(意向);
    返回true;
    }
    返回super.onKeyDown(keyCode,event);
    }
    公共视图单击(AdapterView父视图、View viewDel、int position、,
    长id){
    对于(int i=0;i<1;i++){
    Notes项=listAlerts.get(位置);
    int id=item.getId();
    note=item.getNote();
    时间=item.getTimeStamp();
    }
    系统输出打印项次(备注+“”+时间);
    //      
    }
    @凌驾
    受保护的void onResume(){
    super.onResume();
    }
    @凌驾
    受保护的void onPause(){
    super.onPause();
    setContentView(R.layout.note);
    listView=(listView)findViewById(R.id.notelist);
    setAdapter(空);
    setOnItemClickListener(this);
    noteView=(TextView)findViewById(R.id.noteDisplay);
    timeView=(TextView)findViewById(R.id.notetimeStampDisplay);
    新建MyTask().execute();
    }
    @凌驾
    受保护的空onDestroy(){
    }
    }
    
    来自GCMinentService的代码片段

    @覆盖
    受保护的void onMessage(上下文、意图){
    Log.i(标记“收到的消息”);
    //String message=getString(R.String.gcm_message);
    System.out.println(“onMessage:”);
    Bundle extras=intent.getExtras();
    字符串消息=extras.getString(“消息”);
    String event_id_from_server=extras.getString(“server_id”);
    //显示消息(上下文、消息);
    生成化(上下文、消息);
    saveMsg(消息);
    System.out.println(“服务器id为”+来自服务器的事件id);
    if(来自服务器的事件\u id\u!=null){
    updateLocalDatabase(来自\u服务器的事件\u id\u);
    }
    }
    公共void saveMsg(字符串msg){
    布尔值=真;
    试一试{
    NotificationsDatabase条目=新建NotificationsDatabase(gcminentService.this);
    entry.open();
    java.util.Date Date=新建java.util.Date();
    Timestamp x=新的时间戳(date.getTime());
    字符串时间戳=x.toLocaleString();
    createEntry(消息,时间戳);
    entry.close();
    //更新适配器服务
    }捕获(例外e){
    工作=假;
    字符串错误=e.toString();
    系统输出打印项次(错误);
    }最后{
    如果(工作){
    }
    }
    }
    
    我稍微整理了一下您的代码。基本上,所有视图分配都应该在onCreate中完成一次,而数据的加载应该在onResume()中完成。看看这是否有帮助:

    @覆盖
    创建时的公共void(Bundle savedInstanceState){
    super.onCreate(savedInst