如何通过服务向ListView添加更多项目?

时间:2015-08-11 08:19:55

标签: android

public class MainActivity {
        private MyListViewHelper mTimelineHelper;

        @Override
        protected void onCreate(Bundle savedInstanceState) {

        mListViewHelper = new MyListViewHelper(); 
        mListViewHelper.createListView();

        startService(new Intent(this, MyService.class));
}
}

MyService类:

    public class MyService extends Service {

        private int mCount = 0;

        public static final long NOTIFY_INTERVAL = 10 * 1000;

        private static MyListViewHelper mListViewHelper;

        @Override
        public IBinder onBind(Intent intent) {
            return null;
        }

        @Override
        public void onCreate() {
            // cancel if already existed
            if (mTimer != null) {
                mTimer.cancel();
            } else {
                // recreate new
                mTimer = new Timer();
            }

            // schedule task
            mTimer.scheduleAtFixedRate(new TimeDisplayTimerTask(), 0, NOTIFY_INTERVAL);



        }

        @Override
        public void onDestroy() {
            mTimer.cancel();
        }

        private class TimeDisplayTimerTask extends TimerTask implements LocationListener {

            @Override
            public void run() {

                mHandler.post(new Runnable() {

                    @Override
                    public void run() {
                    //DO SOMETHING HERE
                    ...........
                    mCount++;
                    if(mCount==4){
                       mListViewHelper = new MyListViewHelper()
                       mListViewHelper.addItemToList("ABCD");
                    } 
                }

                });
        public boolean isMainActivityRunning(string packageName) {
             ActivityManager activityManager = (ActivityManager)getSystemService (Context.ACTIVITY_SERVICE);
             List<RunningTaskInfo> tasksInfo = activityManager.getRunningTasks(Integer.MAX_VALUE); 

             for (int i = 0; i < tasksInfo.size(); i++) {
                    if(tasksInfo.get(i).baseActivity.getPackageName.toString().equals(packageName)
                  return true;
                  }

          return false;
          }     
        }
    }

MyListViewHelper类:

public class MyListViewHelper {
    private ListView mListView;
    private ArrayList<String> mArrayList;

    public MyListViewHelper () {
    }

    public void createListView(){
        mArrayList = new ArrayList<String>();
        mListView = (ListView) activity.findViewById(R.id.listView1);
        // I make a short version,so we suppose adapter is already prepared here
        mListView.setadapter(adapter);
    }

    public void addItemToList(String myString){
        mArrayList.add(myString);
        adapter.notifiDateSetChanged();
}
 }

我想要的是每10秒,服务会做一些事情,然后如果这样做4次,我会向ListView添加一个项目。我忘记保存logcat,然后再将其更改回我编辑之前的时间,所以没有logcat,对不起。但我很确定其他人没有任何问题,而且问题就在上面的代码中,因为我倾向于使用Android而我对服务并不了解。请教我解决这个问题!

4 个答案:

答案 0 :(得分:1)

您可以使用EventBus告诉Activity Service正在更新列表。

例如......

您的Activity

public void onEventMainThread(ListUpdateEvent event) {
    mList.add(event.getValue());
    mAdapter.notifyDataSetChanged();
}

您的Service

EventBus.getDefault().post(new ListUpdateEvent("Value to add"));

ListUpdateEvent是一个简单的POJO,可让您共享数据。使用onEventMainThread可以自动保护列表不被后台线程更新。

答案 1 :(得分:0)

Here是有关如何将消息从服​​务发送到活动组件的信息。所以你只需要发送有关新列表项的数据。

答案 2 :(得分:0)

您是否尝试将adapter.notifiDateSetChanged();更改为adapter.notifyDataSetChanged();

顺便说一句,通过服务更新活动的最佳方式是在您的活动onResume()中注册广播接收器,并在您想要更新活动时从您的服务发送广播把你的数据作为额外的。不要忘记在unregister() onPause()接收你的接收者,并在Manifest中声明你的服务。

您可以在此处阅读有关从服务通过广播到活动的数据流的更多信息http://www.truiton.com/2014/09/android-service-broadcastreceiver-example/

答案 3 :(得分:0)

你做不到。无法从服务更新活动中的UI组件。或者,如果你找到一种方法,我会说这是一个坏主意*。

我认为Knosses的EventBus实现是一个好主意。我想建议使用数据库,加载器和广播的实现。

使用ListView的Activity将使用CursorLoader从数据源获取列表内容。服务会将每个项目NOTIFY_INTERVAL添加到数据库并发送广播。活动将注册一个BroadcastReceiver,用于侦听服务发送的广播,在活动中接收广播时,调用getLoaderManager().restartLoader(),这样ListView中的内容将刷新。

编辑: *让我详细说明一下;因为您还可以将服务绑定到您的活动。在这种情况下,通过绑定更新UI组件是完全有效的。