我的应用程序包含一个Activity和一个后台服务(IntentService
)。该活动包含listView
。我想在服务中发生事件时从列表中删除第一项。我的代码是:
public class MyActivity extends Activity {
private ListView taskListBox;
private static ArrayAdapter taskListAdapter;
private static ArrayList<String> data =
new ArrayList<String>();
@Override
protected void onCreate(Bundle savedInstanceState) {
...
taskListBox = (ListView) findViewById(R.id.taskList);
taskListAdapter = new ArrayAdapter(this, data);
taskListBox.setAdapter(taskListAdapter);
startService(new Intent(this, MyService.class));
...
}
public static void removeTask(int index) {
data.remove(index);
taskListAdapter.notifyDataSetChanged();
}
列表填充在onResume
方法中,一切正常。项目是可选择的,并且长按菜单会弹出contextMenu,但是当我从服务类调用removeTask
时,会出现问题,即项目被禁用(不可选)。我的服务类是:
public class MyService extends IntentService {
public MyService() {
super("MyService");
}
protected void onHandleIntent(Intent workIntent) {
while(true) {
try {
Thread.sleep(1000);
}
catch(InterruptedException ex) {
Thread.currentThread().interrupt();
}
try {
if (MyActivity.dateNow().compareTo(MyActivity.futureDate()) >= 0) {
MyActivity.removeTask(0);
}
}catch(Exception ex) {
}
}
}
}
我确信if
中的MyService
块已执行,但项目未从列表中删除,它就像禁用项目一样。单击该项不起作用。有人能指出这段代码中的问题吗?
答案 0 :(得分:0)
您不应该使用静态修饰符在“活动”和“服务”之间共享数据(和方法)。这通常是一个坏主意,因为您在2进程之间引入了同步问题。
正确的做法是将“MyActivity”绑定到“MyService”
查看此tutorial,了解如何在服务和活动之间设置绑定。
完成后,您应该在活动中创建服务可以调用的回调方法。在你的情况下,'removeTask'将是服务将调用的回调方法。