Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 最佳实践:不断更新ArrayAdapter_Android_Multithreading_Listview_Adapter_Handler - Fatal编程技术网

Android 最佳实践:不断更新ArrayAdapter

Android 最佳实践:不断更新ArrayAdapter,android,multithreading,listview,adapter,handler,Android,Multithreading,Listview,Adapter,Handler,我有一个服务,它从web获取一些数据,并更新应用程序中“存储”的列表 因此,我可以从主活动访问它,并将其用于ArrayAdapter 当我更新数据时,列表中的引用项会发生更改 我的问题是,在主活动中更新适配器中的数据的最佳实践是什么 我心中有两个解决方案,但我不知道它们是否正确。除此之外,我想实现一个版本,这是不使用太多的电池 第一个:每秒调用一次的线程,使用notifyDataSetChanged()更新适配器: 第二:使用延迟处理程序post 私有最终处理程序=新处理程序() 那么,最好的方

我有一个服务,它从web获取一些数据,并更新应用程序中“存储”的列表

因此,我可以从主活动访问它,并将其用于ArrayAdapter

当我更新数据时,列表中的引用项会发生更改

我的问题是,在主活动中更新适配器中的数据的最佳实践是什么

我心中有两个解决方案,但我不知道它们是否正确。除此之外,我想实现一个版本,这是不使用太多的电池

第一个:每秒调用一次的线程,使用notifyDataSetChanged()更新适配器:

第二:使用延迟处理程序post 私有最终处理程序=新处理程序()


那么,最好的方法是什么?也许还有别的办法,但我以前从未想过

您将使用异步任务,而不是使用处理程序。虽然处理程序在这里工作,但它是JAVA概念,异步任务是Android


您可以使用:mFileAdapter.notifyDataSetChanged()更新列表视图;只是它是正确的

您可以使用
AlarmManager
,而不是使用
Handler
Thread
。只需启动报警一次,它就会在没有任何线程或处理程序的情况下用定义的间隔时间更新列表。您已经创建了一个服务,可以使用AlarmManager引用该服务

AlarmManager mgr = (AlarmManager) arg0.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(arg0, TestService.class);
PendingIntent pi = PendingIntent.getService(arg0, 0, intent, 0);
mgr.setRepeating(AlarmManager.RTC_WAKEUP, 2000, 2000, pi);

TestService
中,您可以获得更新列表的代码。

如果我错了,请纠正我,但从我的角度来看,异步任务负责一个正在短期运行的任务,需要在任务完成期间或之后进行更新。
private void startListUpdate()
{
    handler.removeCallbacks(UpdateListUI);
    handler.postDelayed(UpdateListUI, 1000); // 1 second   

}

private Runnable UpdateListUI = new Runnable() {
    public void run() { 
        //Remove Elements first
        removeDeletedItemsFromList();

        //Update Adapter
        mFileAdapter.notifyDataSetChanged();

        handler.postDelayed(this, 1500); // 1,5 seconds
    }
};  
AlarmManager mgr = (AlarmManager) arg0.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(arg0, TestService.class);
PendingIntent pi = PendingIntent.getService(arg0, 0, intent, 0);
mgr.setRepeating(AlarmManager.RTC_WAKEUP, 2000, 2000, pi);