2
votes

Comment puis-je transmettre une intention au thread principal en utilisant "startActivity" à partir d'un deuxième thread?

Je veux utiliser un Intent avec start (Intent) et faire différentes choses contrôlées par un Thread. Je sais que j'ai besoin du contexte principal pour utiliser "startActivity", mais comment puis-je gérer cela à partir d'un thread séparé? est-il possible de lier le "startActivity" au thread principal en utilisant un gestionnaire ou quelque chose?

Exemple d'utilisation:

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);
            }
        });

    }
}

Update

C'est le code avec lequel j'ai des problèmes:

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

C'est ce que j'ai fait dans MainActivity

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)
   }
} 
}

Question

Comment puis-je exécuter certains Intents à partir d'un thread secondaire écrit dans une classe séparée?

Si cette idée elle-même n'est pas correcte:

I Je ne sais pas comment transmettre une intention au fil de discussion principal en utilisant "starActivity".


1 commentaires

5 Réponses :


1
votes
currentActivity.runOnUiThread(new Runnable {
    startActivity(...);
});

9 commentaires

Comme: Public Classic mThread étend MainActivity implémente Runnable {


Je ne sais pas à quoi ressemble votre code mais je vais élaborer un peu plus.


Le gestionnaire ne doit pas être défini comme statique: public Handler mainHandler = ...


Non, cela ne fonctionne tout simplement pas, l'application se bloque lorsqu'elle atteint ce stade.


Utilisez le débogueur et recherchez l'erreur avec laquelle l'application se bloque.


E / AndroidRuntime: FATAL EXCEPTION: Processus principal: com.example.lenkzeitapplikation_01, PID: 5206 java.lang.NullPointerException: Tentative d'invocation de la méthode virtuelle 'android.app.ActivityThread $ ApplicationThread android.app.ActivityThread.getApplicationThread ()' sur a référence d'objet nul


Mais je ne comprends pas cette erreur, car lorsque je commente juste le "startActivity", cela fonctionne sans cette exception.


Donc, ce que cela signifie, c'est que votre activité est nulle. Vous devez le réussir correctement.


D'accord, pouvez-vous me dire comment?



1
votes

Vous avez besoin d'un lien vers le contexte, l'activité ou toute vue sur l'activité. Rendre exécutable du code, qui devrait être exécuté dans le thread principal

view.post(your_code)

Pour le contexte:

activity.runOnUiThread(your_code)

pour l'activité:

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

pour la vue:

Runnable your_code = new Runnable({
    @Override
    public void run(){
         Intent intent = new Intent(context, MyActivity.class);
         startActivity(intent);
    }
};


4 commentaires

Comme: Public Classic mThread étend MainActivity implémente Runnable {@override Public void Run () {If (true) {Intent intent = new Intent (Bluetoothadapter.Enable ()): Activity.runOnUiThread (Intent)


Votre exemple n'a aucun sens. Il n'a pas deux accolades fermantes dans le et au moins, et il n'a aucun sens pour faire étendre MainActivity. Modifiez votre exemple et formatez votre code


activity.runOnUiThread (your_code) me donne: La méthode non statique 'runOnUiThread (java.lang.Runnable)' ne peut pas être référencée à partir d'un contexte statique


il cause son metod non statique. Vous ne pouvez pas écrire Activity.runOnUIThread, vous devez créer un champ comme Activité privée mACtivity = link_to_my_activity. Et maintenant, vous pouvez utiliser mActivity.runInUIThread. Vous devez donner à link_to_my_activity dans votre sous-discussion, les moyens de le faire nécessaires pour créer une autre question



1
votes

Tout ce dont vous avez besoin est un objet Context qui peut être appelé à partir de n'importe quel thread

Si vous stockez une instance de Contexte, assurez-vous de maintenir comme ApplicationContext () pour éviter les fuites de mémoire

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

new Thread(new Runnable(){

public void run(){
ctx.startActivity(new Intent(ctx,MainActivity.class));
 }
}).start();


0 commentaires

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

0 commentaires

0
votes

La solution est WeakReference

Dans le nouveau thread, vous devez implémenter ce qui suit:

Runnable rcBT_startcheck = new cBT_startcheck(this);
new Thread(rcBT_startcheck).start();

MainActivity onCreat

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)
       }
}

0 commentaires