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

如何从线程向其他类传数据及在MainActivity中从线程t获取tdate

线程数据传递问题解答

咱们先解决你提到的第二个具体问题:在MainActivity中从线程t获取tdate相关的数据。从你的代码片段来看,线程t里是每隔1秒获取当前时间戳并更新TextView,要把这个时间戳拿到MainActivity的其他地方用,可以这么做:

步骤1:在MainActivity中定义成员变量存储数据

首先在MainActivity类里声明一个线程安全的成员变量,用来保存线程中获取的时间戳:

// 用volatile保证多线程下的可见性
private volatile long currentTimestamp;

步骤2:在线程中更新这个成员变量

修改你原来的线程代码,在更新TextView的同时,把时间戳赋值给这个成员变量:

Thread t = new Thread() {
    @Override
    public void run() {
        try {
            while (!isInterrupted()) {
                Thread.sleep(1000);
                final long date = System.currentTimeMillis(); // 先拿到当前时间戳
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        TextView tdate = (TextView) findViewById(R.id.date);
                        tdate.setText(String.valueOf(date)); // 更新UI
                        currentTimestamp = date; // 把时间戳同步到成员变量
                    }
                });
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
};

这样一来,MainActivity里的其他方法(比如registerUser())就可以直接访问currentTimestamp变量,拿到线程t传递过来的时间数据了。


接下来解决第一个通用问题:如何从线程向另一个类传递数据?这里给你三种常用的方案:

方案1:使用回调接口(最通用的方式)

定义一个回调接口,让接收数据的类实现这个接口,线程持有接口实例,当数据准备好时调用接口方法传递数据:

// 第一步:定义回调接口
public interface DataCallback {
    void onDataReceived(long data);
}

// 第二步:接收数据的类实现接口
public class DataReceiver implements DataCallback {
    @Override
    public void onDataReceived(long data) {
        // 在这里处理线程传递过来的数据
        System.out.println("收到线程传来的时间戳:" + data);
    }
}

// 第三步:线程中调用回调传递数据
// 在MainActivity中使用示例:
DataReceiver receiver = new DataReceiver();
Thread t = new Thread() {
    @Override
    public void run() {
        long date = System.currentTimeMillis();
        // 调用回调方法传递数据
        if (receiver != null) {
            receiver.onDataReceived(date);
        }
    }
};
t.start();

方案2:使用Android的Handler(Android环境专属)

如果是Android开发,你可以用Handler来跨线程传递消息,接收数据的类持有Handler实例,线程通过sendMessage把数据发过去:

// 接收数据的类
public class AnotherClass {
    // 初始化Handler,绑定主线程Looper(如果需要更新UI的话)
    private Handler dataHandler = new Handler(Looper.getMainLooper()) {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            // 从消息中取出数据
            long timestamp = (long) msg.obj;
            // 处理数据
        }
    };

    public Handler getHandler() {
        return dataHandler;
    }
}

// 线程中发送数据
AnotherClass anotherClass = new AnotherClass();
Thread t = new Thread() {
    @Override
    public void run() {
        long date = System.currentTimeMillis();
        Message msg = Message.obtain();
        msg.obj = date; // 把数据放到消息里
        anotherClass.getHandler().sendMessage(msg);
    }
};
t.start();

方案3:使用共享变量

如果两个类都能访问同一个共享对象,线程更新这个对象里的变量,接收类读取即可。注意要保证线程安全:

// 定义一个共享数据类
public class SharedTimestamp {
    // volatile保证多线程下变量可见
    private volatile long timestamp;

    public long getTimestamp() {
        return timestamp;
    }

    public void setTimestamp(long timestamp) {
        this.timestamp = timestamp;
    }
}

// 线程中更新数据
SharedTimestamp sharedData = new SharedTimestamp();
Thread t = new Thread() {
    @Override
    public void run() {
        sharedData.setTimestamp(System.currentTimeMillis());
    }
};
t.start();

// 另一个类中读取数据
public class DataReader {
    private SharedTimestamp sharedData;

    public DataReader(SharedTimestamp sharedData) {
        this.sharedData = sharedData;
    }

    public void readData() {
        long data = sharedData.getTimestamp();
        // 处理数据
    }
}

内容的提问来源于stack exchange,提问作者kara

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:04:18