【问题标题】:Best-practice: Update ArrayAdapter continuously最佳实践:不断更新 ArrayAdapter
【发布时间】:2023-03-13 06:16:01
【问题描述】:

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

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

当我更新数据时,列表中引用的项目发生了变化。

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

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

First:每秒调用一次的线程,使用 notifyDataSetChanged() 更新 Adapter:

private void startListUpdateThread()  
{
    Thread ListManageThread = new Thread() {
        LinkItem listItem;
        public void run() {
            Log.d("DL", "List Update - start");
            while(true)
            {   
                runOnUiThread(UpdateGUIList);

                try {
                    Thread.sleep(1000); //5Sekunden!
                } 
                catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                    Log.e("DL", "ERROR: InterruptedException - " + e.getMessage());
                }
            }
        }
    };
    ListManageThread.start();  
}

private Runnable UpdateGUIList = new Runnable() {

    @Override
    public void run() {
        mFileAdapter.notifyDataSetChanged();
    }
};    

第二:使用延迟的 Handler 发布 private final Handler handler = new Handler();

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
    }
};  

那么,最好的方法是什么?也许还有其他方法可以做到,但我以前没有想到过!

【问题讨论】:

    标签: android multithreading listview adapter handler


    【解决方案1】:

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

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

    【讨论】:

    • 如果我错了,请纠正我,但从我的角度来看,异步任务负责一个即将运行并需要更新的任务during任务完成之后。
    【解决方案2】:

    您可以使用AlarmManager,而不是使用HandlerThread。只需启动一次警报,它就会以定义的时间间隔更新您的列表,而无需任何线程或处理程序。您已经创建了一个服务,您可以使用 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 中,您可以获得更新列表的代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-02
      • 1970-01-01
      • 2010-10-01
      • 2017-01-31
      相关资源
      最近更新 更多