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

Android Studio:如何从Thread向Activity传递数据

解决NFC线程获取数据后启动Activity的问题

方法1:线程初始化时传入Context

线程创建时直接传入Activity或Application的Context,用这个Context创建Intent启动Activity,注意UI操作要切回主线程:

public class NFCDataThread extends Thread {
    private Context mContext;
    private String nfcData;

    public NFCDataThread(Context context) {
        mContext = context;
    }

    @Override
    public void run() {
        // 模拟读取NFC数据
        nfcData = "NFC卡读取到的内容";
        
        // 切回主线程执行启动操作
        ((Activity) mContext).runOnUiThread(() -> {
            Intent intent = new Intent(mContext, TargetActivity.class);
            intent.putExtra("NFC_DATA", nfcData);
            mContext.startActivity(intent);
        });
    }
}

调用时直接传当前Activity的Context:

new NFCDataThread(this).start();

如果用Application Context,启动Activity需要添加FLAG_ACTIVITY_NEW_TASK标记,优先用Activity Context更稳妥。

方法2:用Handler将数据传递到主线程

在主线程创建Handler,把Handler传给线程,线程获取数据后通过Handler发消息,主线程收到消息后启动Activity,线程无需持有Context:

// 主线程定义Handler
private Handler mHandler = new Handler(Looper.getMainLooper()) {
    @Override
    public void handleMessage(Message msg) {
        super.handleMessage(msg);
        String nfcData = (String) msg.obj;
        Intent intent = new Intent(MainActivity.this, TargetActivity.class);
        intent.putExtra("NFC_DATA", nfcData);
        startActivity(intent);
    }
};

// 线程类
public class NFCDataThread extends Thread {
    private Handler mHandler;

    public NFCDataThread(Handler handler) {
        mHandler = handler;
    }

    @Override
    public void run() {
        String nfcData = "NFC卡读取到的内容";
        Message msg = mHandler.obtainMessage();
        msg.obj = nfcData;
        mHandler.sendMessage(msg);
    }
}

调用:

new NFCDataThread(mHandler).start();

方法3:接口回调传递数据

定义回调接口,线程获取数据后回调给主线程,由主线程负责启动Activity,完全避免线程持有Context:

// 定义回调接口
public interface NFCDataCallback {
    void onDataReceived(String data);
}

// 线程类
public class NFCDataThread extends Thread {
    private NFCDataCallback mCallback;

    public NFCDataThread(NFCDataCallback callback) {
        mCallback = callback;
    }

    @Override
    public void run() {
        String nfcData = "NFC卡读取到的内容";
        // 切回主线程回调,避免线程安全问题
        new Handler(Looper.getMainLooper()).post(() -> mCallback.onDataReceived(nfcData));
    }
}

在Activity中实现回调:

new NFCDataThread(data -> {
    Intent intent = new Intent(MainActivity.this, TargetActivity.class);
    intent.putExtra("NFC_DATA", data);
    startActivity(intent);
}).start();

这几种方法都比全局变量更高效解耦,优先推荐接口回调或Handler方式,能避免线程持有Context引发的内存泄漏风险。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 04:07:10