You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过任务重复刷新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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 19:37:15