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而我对服务并不了解。请教我解决这个问题!
答案 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组件是完全有效的。