如何使用第二个线程的 "startActivity" 将 Intent 传递给主线程?
How can I pass an Intent to the main thread using "startActivity" from a secound thread?
我想将 Intent 与 start(Intent) 一起使用,并执行由线程控制的不同事情。
我知道我需要主上下文才能使用“startActivity”,但如何从单独的线程管理它?
是否可以 link 使用处理程序或其他方式将“startActivity”发送到主线程?
使用示例:
Public Classic mThread implements Runnable{
@override
Public void Run()
{
If (true) //something is true
{
Intent intent = new Intent (Bluetoothadapter.Enable()):
startActivity(Intent):
}
If(true) //Something else is true
{
Intent intent = new Intent (MainActivity, esp.class);
startActivity (intent)
}
}
}
更新
这是我遇到问题的代码:
public class cBT_startcheck extends MainActivity implements Runnable {
private int iCurrent_BT_state = mBluetoothAdapter.getState();
@Override
public void run() {
if (mBluetoothAdapter == null) {
cGlobal_values.bBT_NOADAPTER =true;
}else if (mBluetoothAdapter != null)
{
cGlobal_values.bBT_NOADAPTER =false;
switch (iCurrent_BT_state)
{
case BluetoothAdapter.STATE_ON:
cGlobal_values.bBT_GenState_on=true;
break;
case BluetoothAdapter.STATE_OFF:
cGlobal_values.bBT_GenState_on =false;
break;
}
if (!mBluetoothAdapter.isEnabled()){
Log.d("HALLO", "run: ");
//Intent intBT_start = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
//mainContext.startActivity(intBT_start);
vStart_BT();
}
}
}
}
主要活动
这是我在MainActivity中做的
public class MainActivity extends AppCompatActivity {
public Handler mainHandler = new Handler(Looper.getMainLooper());
public void vStart_BT()
{
mainHandler.post(new Runnable() {
@Override
public void run() {
Intent intBT_start = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivity(intBT_start);
}
});
}
}
问题
如何从单独 class 中编写的第二个线程执行一些 Intent?
如果这个想法本身不对:
我不知道如何使用“starActivity”将 Intent 传递给主线程。
Activity.runOnUiThread(Runnable)
是您需要的方法。它向主 Android 线程发布一个可运行的(在本例中是启动 activity 的一个)。
可按如下方式进行:
currentActivity.runOnUiThread(new Runnable {
startActivity(...);
});
您需要 link 上下文,activity 或 activity 上的任何视图。使代码可运行,应该在主线程中执行
Runnable your_code = new Runnable({
@Override
public void run(){
Intent intent = new Intent(context, MyActivity.class);
startActivity(intent);
}
};
对于上下文:
Looper looper = context.getMainLooper(); //Looper of main thread
Handler handler = new Handler(looper);
handler.post(your_code); //send your code to executing in main thread
对于 activity:
activity.runOnUiThread(your_code)
查看:
view.post(your_code)
您只需要可以从任何线程调用的 Context 对象
如果您正在存储 Context 实例,请确保保存为 ApplicationContext() 以避免内存泄漏
final Context ctx = MainActivity.this.getApplicationContext();
new Thread(new Runnable(){
public void run(){
ctx.startActivity(new Intent(ctx,MainActivity.class));
}
}).start();
new Thread(new Runnable(){
public void run(){
getApplicationContext.startActivity(new Intent(getApplicationContext,MainActivity.class));
}
}).start();
解决方案是 WeakReference<>
在新的Thread中,需要实现以下内容:
public class cBT_startcheck extends MainActivity implements Runnable {
private WeakReference<MainActivity> activityWeakReference;
cBT_startcheck(MainActivity activity){
activityWeakReference =new WeakReference<MainActivity>(activity);
}
@Override
public void run() {
final MainActivity activity =activityWeakReference.get();
Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
activity.startAplication(intent)
}
}
MainActivity onCreat
Runnable rcBT_startcheck = new cBT_startcheck(this);
new Thread(rcBT_startcheck).start();
我想将 Intent 与 start(Intent) 一起使用,并执行由线程控制的不同事情。 我知道我需要主上下文才能使用“startActivity”,但如何从单独的线程管理它? 是否可以 link 使用处理程序或其他方式将“startActivity”发送到主线程?
使用示例:
Public Classic mThread implements Runnable{
@override
Public void Run()
{
If (true) //something is true
{
Intent intent = new Intent (Bluetoothadapter.Enable()):
startActivity(Intent):
}
If(true) //Something else is true
{
Intent intent = new Intent (MainActivity, esp.class);
startActivity (intent)
}
}
}
更新
这是我遇到问题的代码:
public class cBT_startcheck extends MainActivity implements Runnable {
private int iCurrent_BT_state = mBluetoothAdapter.getState();
@Override
public void run() {
if (mBluetoothAdapter == null) {
cGlobal_values.bBT_NOADAPTER =true;
}else if (mBluetoothAdapter != null)
{
cGlobal_values.bBT_NOADAPTER =false;
switch (iCurrent_BT_state)
{
case BluetoothAdapter.STATE_ON:
cGlobal_values.bBT_GenState_on=true;
break;
case BluetoothAdapter.STATE_OFF:
cGlobal_values.bBT_GenState_on =false;
break;
}
if (!mBluetoothAdapter.isEnabled()){
Log.d("HALLO", "run: ");
//Intent intBT_start = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
//mainContext.startActivity(intBT_start);
vStart_BT();
}
}
}
}
主要活动
这是我在MainActivity中做的
public class MainActivity extends AppCompatActivity {
public Handler mainHandler = new Handler(Looper.getMainLooper());
public void vStart_BT()
{
mainHandler.post(new Runnable() {
@Override
public void run() {
Intent intBT_start = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivity(intBT_start);
}
});
}
}
问题
如何从单独 class 中编写的第二个线程执行一些 Intent?
如果这个想法本身不对:
我不知道如何使用“starActivity”将 Intent 传递给主线程。
Activity.runOnUiThread(Runnable)
是您需要的方法。它向主 Android 线程发布一个可运行的(在本例中是启动 activity 的一个)。
可按如下方式进行:
currentActivity.runOnUiThread(new Runnable {
startActivity(...);
});
您需要 link 上下文,activity 或 activity 上的任何视图。使代码可运行,应该在主线程中执行
Runnable your_code = new Runnable({
@Override
public void run(){
Intent intent = new Intent(context, MyActivity.class);
startActivity(intent);
}
};
对于上下文:
Looper looper = context.getMainLooper(); //Looper of main thread
Handler handler = new Handler(looper);
handler.post(your_code); //send your code to executing in main thread
对于 activity:
activity.runOnUiThread(your_code)
查看:
view.post(your_code)
您只需要可以从任何线程调用的 Context 对象
如果您正在存储 Context 实例,请确保保存为 ApplicationContext() 以避免内存泄漏
final Context ctx = MainActivity.this.getApplicationContext();
new Thread(new Runnable(){
public void run(){
ctx.startActivity(new Intent(ctx,MainActivity.class));
}
}).start();
new Thread(new Runnable(){
public void run(){
getApplicationContext.startActivity(new Intent(getApplicationContext,MainActivity.class));
}
}).start();
解决方案是 WeakReference<>
在新的Thread中,需要实现以下内容:
public class cBT_startcheck extends MainActivity implements Runnable {
private WeakReference<MainActivity> activityWeakReference;
cBT_startcheck(MainActivity activity){
activityWeakReference =new WeakReference<MainActivity>(activity);
}
@Override
public void run() {
final MainActivity activity =activityWeakReference.get();
Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
activity.startAplication(intent)
}
}
MainActivity onCreat
Runnable rcBT_startcheck = new cBT_startcheck(this);
new Thread(rcBT_startcheck).start();