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
相关产品推荐
相关产品推荐

