如何通过任务重复刷新ListView并传递参数?(Java平板应用)
解决Runnable传递参数并实现重复数据获取任务的几种方法
方法1:自定义Runnable子类,通过构造方法传参
创建继承自Runnable的子类,在构造方法中接收所需参数(如ZawodnicyWyniki实例、ListView对象等),在run()方法中直接使用这些参数执行逻辑。
示例代码:
public class DataFetchRunnable implements Runnable { private ZawodnicyWyniki zawodnicyWyniki; private ListView listView; // 构造方法传入依赖参数 public DataFetchRunnable(ZawodnicyWyniki zawodnicyWyniki, ListView listView) { this.zawodnicyWyniki = zawodnicyWyniki; this.listView = listView; } @Override public void run() { // 1. 调用已有逻辑获取SQL Server数据 List<YourDataModel> data = zawodnicyWyniki.fetchDataFromSQLServer(); // 2. 切换到主线程刷新ListView(Android UI操作必须在主线程) listView.post(new Runnable() { @Override public void run() { YourListAdapter adapter = (YourListAdapter) listView.getAdapter(); adapter.updateData(data); adapter.notifyDataSetChanged(); } }); } }
启动定时重复任务(用ScheduledExecutorService实现):
// 初始化实例 ZawodnicyWyniki zawodnicyWyniki = new ZawodnicyWyniki(); ListView targetListView = findViewById(R.id.your_list_view); // 创建定时调度器,初始延迟0秒,每隔5秒执行一次 ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor(); scheduler.scheduleAtFixedRate( new DataFetchRunnable(zawodnicyWyniki, targetListView), 0, 5, TimeUnit.SECONDS );
方法2:匿名内部类捕获外部变量(适合简单场景)
如果参数不多,可直接在创建Runnable时捕获外部的**有效不可变(effectively final)**变量,无需自定义子类:
ZawodnicyWyniki zawodnicyWyniki = new ZawodnicyWyniki(); ListView listView = findViewById(R.id.your_list_view); ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor(); scheduler.scheduleAtFixedRate(new Runnable() { @Override public void run() { List<YourDataModel> data = zawodnicyWyniki.fetchDataFromSQLServer(); // 主线程刷新UI listView.post(() -> { YourListAdapter adapter = (YourListAdapter) listView.getAdapter(); adapter.updateData(data); adapter.notifyDataSetChanged(); }); } }, 0, 5, TimeUnit.SECONDS);
方法3:Handler传递参数(需动态更新参数场景)
如果需要在任务执行过程中动态传递数据,可结合Handler在子线程与主线程间通信:
// 主线程Handler,用于接收数据并更新UI private Handler uiHandler = new Handler(Looper.getMainLooper()) { @Override public void handleMessage(Message msg) { List<YourDataModel> data = (List<YourDataModel>) msg.obj; YourListAdapter adapter = (YourListAdapter) listView.getAdapter(); adapter.updateData(data); adapter.notifyDataSetChanged(); } }; // 启动定时任务 ZawodnicyWyniki zawodnicyWyniki = new ZawodnicyWyniki(); ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor(); scheduler.scheduleAtFixedRate(new Runnable() { @Override public void run() { List<YourDataModel> data = zawodnicyWyniki.fetchDataFromSQLServer(); // 将数据封装到Message中发送到主线程 Message msg = uiHandler.obtainMessage(); msg.obj = data; uiHandler.sendMessage(msg); } }, 0, 5, TimeUnit.SECONDS);
注意事项
- 数据库连接需做好资源管理,建议用连接池或每次操作后关闭连接,避免内存泄漏
- 定时任务不再使用时,需调用
scheduler.shutdown()停止(如在Activity的onDestroy()方法中) - Android平台需申请网络权限,Android 8+后台定时任务建议用
WorkManager适配系统限制
内容的提问来源于stack exchange,提问作者Rafal S
相关产品推荐
相关产品推荐

