Как я могу передать Намерение в основной поток, используя "startActivity" из второго потока? - PullRequest
1 голос
/ 22 мая 2019

Я хочу использовать Intent with start (Intent) и делать разные вещи, контролируемые Thread. Я знаю, что мне нужен основной контекст для использования «startActivity», но как мне управлять этим из отдельного потока? Можно ли связать «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

Это то, что я сделал в 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);
            }
        });

    }
}

Вопрос

Как я могу выполнить некоторые Интенты из второстепенного потока, написанного в отдельном классе?

Если сама идея неверна:

Я не знаю, как передать Намерение в основной поток, используя "starActivity".

Ответы [ 5 ]

1 голос
/ 22 мая 2019

Вам нужна ссылка на контекст, активность или любой взгляд на активность.Сделать возможным выполнение кода, который должен выполняться в основном потоке

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.runOnUiThread(your_code)

для просмотра:

view.post(your_code)
1 голос
/ 22 мая 2019

Все, что вам нужно, это объект Context, который может быть вызван из любого потока

Если вы храните экземпляр Context, убедитесь, что он удерживается как ApplicationContext (), чтобы избежать утечки памяти

final Context ctx = MainActivity.this.getApplicationContext();

new Thread(new Runnable(){

public void run(){
ctx.startActivity(new Intent(ctx,MainActivity.class));
 }
}).start();
1 голос
/ 22 мая 2019
Activity.runOnUiThread(Runnable)

- это метод, который вам нужен.Он отправляет работоспособный (в данном случае тот, который запускает действие) в основной поток Android.

Может быть сделано следующим образом:

currentActivity.runOnUiThread(new Runnable {
    startActivity(...);
});
0 голосов
/ 24 мая 2019

Решение - WeakReference <>

В новом потоке вам необходимо реализовать следующее:

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();
0 голосов
/ 22 мая 2019

new Thread (new Runnable () {public void run () {getApplicationContext.startActivity (new Intent (getApplicationContext, MainActivity.class));}}). Start ();

...