Les Handler [Résolu]

ErmalF - 19 nov. 2012 à 14:50 - Dernière réponse :  ErmalF
- 19 nov. 2012 à 20:50
Bonjour,

Je suis en train de decouvrir la programmation sur Eclips et j'essais de faire une application pour communiquer avec un module Bluetooth.
J'ai trouvé un site qui m'explique comment faire et qui donne une code source.

http://nononux.free.fr/index.php?page=elec-brico-bluetooth-android-microcontroleur

Malheureusement, j'ais un warning que je ne comprend pas.

final Handler handlerStatus = new Handler() 
{
public void handleMessage(Message msg) 
{
int co = msg.arg1;
        if(co == 1) 
{
          	logview.append("Connected\n");
        } 
else if(co == 2) 
{
           	logview.append("Disconnected\n");
        }
}
};

final Handler handler = new Handler() 
{
        public void handleMessage(Message msg) 
{
            String data = msg.getData().getString("receivedData");
            
            long t = System.currentTimeMillis();
            if(t-lastTime > 100) 
{// Pour éviter que les messages soit coupés
                logview.append("\n");
lastTime = System.currentTimeMillis();
}
            logview.append(data);
        }
    };


Le warning est : "This Handler class should be static or leaks might occor (com.bluetooth.cfpt.Main.1)


Si quelqu'un connais l'explication de ce warning, pourrait-il m'aider s'il vous plaît. Merci


Ermal
Afficher la suite 

Votre réponse

11 réponses

Meilleure réponse
cs_Julien39 6450 Messages postés mardi 8 mars 2005Date d'inscriptionModérateurStatut 17 mai 2018 Dernière intervention - 19 nov. 2012 à 14:56
3
Merci
Salut,

Remplaces final Handler handlerStatus = new Handler()

par
static final Handler handlerStatus = new Handler()

Et tu devrais créer une classe à part plutôt que de créer une classe interne.

Merci cs_Julien39 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 97 internautes ce mois-ci

Commenter la réponse de cs_Julien39
Meilleure réponse
3
Merci
Ah oui, le warning apparaît sur le deuxième "final Handler..."

final Handler handler = new Handler() 
{
        public void handleMessage(Message msg) 
{
            String data = msg.getData().getString("receivedData");
            
            long t = System.currentTimeMillis();
            if(t-lastTime > 100) 
{// Pour éviter que les messages soit coupés
                logview.append("\n");
lastTime = System.currentTimeMillis();
}
            logview.append(data);
        }
    };


Sur la première ligne "final Handler ..."

Merci

Ermal

Merci ErmalF 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 97 internautes ce mois-ci

Commenter la réponse de ErmalF
Meilleure réponse
3
Merci
Excuse moi si je te pose des question bette ou que la formulation de mes questions est approximative , mais je débute en java.

Je crois que le Hendleur et déclaré dans la classe BtInterface qu'il a créer.

Si je fais se que tu me conseille, il y aura pas de problème avec mon appli vue que presque tous le code se trouve dans la class BtInterface, Il saura que se qui est dans "final Handleur..." est relier a la class BtInterface???

Et pk le premier "final Handler..." il y a pas de warning comme sur le deusième?

Désolé si je suis imprecis dans ma question.
Merci pour l'aide que tu m'apporte

Ermal

Merci ErmalF 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 97 internautes ce mois-ci

Commenter la réponse de ErmalF
Meilleure réponse
cs_Julien39 6450 Messages postés mardi 8 mars 2005Date d'inscriptionModérateurStatut 17 mai 2018 Dernière intervention - 19 nov. 2012 à 15:43
3
Merci
Il te manque des méthodes, il faut que tu implémentes

		@Override
public void close() throws SecurityException {			
}

@Override
public void flush() {
}

@Override
public void publish(LogRecord arg0) {
}

Merci cs_Julien39 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 97 internautes ce mois-ci

Commenter la réponse de cs_Julien39
Meilleure réponse
cs_Julien39 6450 Messages postés mardi 8 mars 2005Date d'inscriptionModérateurStatut 17 mai 2018 Dernière intervention - 19 nov. 2012 à 16:05
3
Merci
clase -> close

Est ce que tu es certain que l'import que tu as fait est le bon ?

import java.util.logging.Handler;

Merci cs_Julien39 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 97 internautes ce mois-ci

Commenter la réponse de cs_Julien39
Meilleure réponse
3
Merci
Je m'exprime pas bien je pence.

Je te montre mon code complais

Code principale:

package com.bluetooth.cfpt;

import android.os.Bundle;
import android.app.Activity;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivityBluetooth extends Activity implements OnClickListener 
{

private TextView logview;
private EditText sendtext;
private Button connect, send;

private Bluetooth bt = null;
    
private long lastTime = 0;

final Handler handlerStatus = new Handler() 
{
public void handleMessage(Message msg) 
{
int co = msg.arg1;
        if(co == 1) 
{
          	logview.append("Connected\n");
        } 
else if(co == 2) 
{
           	logview.append("Disconnected\n");
        }
}
};

final Handler handler = new Handler() 
{
        public void handleMessage(Message msg) 
{
            String data = msg.getData().getString("receivedData");
            
            long t = System.currentTimeMillis();
            if(t-lastTime > 100) 
{// Pour éviter que les messages soit coupés
                logview.append("\n");
lastTime = System.currentTimeMillis();
}
            logview.append(data);
        }
    };
    
    

    /** Called when the activity is first created. */

    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main_activity_bluetooth);
        
        bt = new Bluetooth (handlerStatus, handler);
        
        logview = (TextView)findViewById(R.id.logview);
        sendtext = (EditText)findViewById(R.id.sendtxt);
        
        connect = (Button)findViewById(R.id.connect);
        connect.setOnClickListener(this);
        
        send = (Button)findViewById(R.id.send);
        send.setOnClickListener(this);
        
    }
    public void onClick(View v) 
{
if(v == connect) 
{
bt.connect();

} 
else if(v == send) 
{
bt.sendData(sendtext.getText().toString());
}
}
}


Class que j'ai créer:

package com.bluetooth.cfpt;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Set;
import java.util.UUID;

import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;

public class Bluetooth {

private BluetoothDevice device = null;
private BluetoothSocket socket = null;
private InputStream receiveStream = null;
private OutputStream sendStream = null;

private ReceiverThread receiverThread;

Handler handler;

public Bluetooth(Handler hstatus, Handler h) 
{
Set setpairedDevices = BluetoothAdapter.getDefaultAdapter().getBondedDevices();
BluetoothDevice[] pairedDevices = (BluetoothDevice[]) setpairedDevices.toArray(new BluetoothDevice[setpairedDevices.size()]);

for(int i=0;i 0) 
{

byte buffer[] = new byte[100];
int k = receiveStream.read(buffer, 0, 100);

if(k > 0) 
{
byte rawdata[] = new byte[k];
for(int i=0;i<k;i++)
rawdata[i] = buffer[i];

String data = new String(rawdata);

Message msg = handler.obtainMessage();
Bundle b = new Bundle();
b.putString("receivedData", data);
                msg.setData(b);
                handler.sendMessage(msg);
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}


Sur le "final Handler handler = new Handler() " que j'ais un warning.

Si je change leur place sur le code et que je les inverses, c'est "final Handler handlerStatus = new Handler()" ou apparais le warning.

Pourquoi le premier et ok mais c'est toujours le deuxième qui fonctionne pas?
Pourtant, je fais presque le mème chose dans le premier que dans le deusième et que si je les interverti c'est l'autre qui bug

Ermal

Merci ErmalF 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 97 internautes ce mois-ci

Commenter la réponse de ErmalF
Meilleure réponse
cs_Julien39 6450 Messages postés mardi 8 mars 2005Date d'inscriptionModérateurStatut 17 mai 2018 Dernière intervention - 19 nov. 2012 à 16:34
3
Merci
Ok, j'ai compris,

Tu as deux handlers qui partagent le même thread, et donc le deuxième t'affiche un warning.

Tu vas saturer l'espace mémoire si tu laisses tel quel ton code. Je te conseil de lire ca : http://stackoverflow.com/questions/11407943/this-handler-class-should-be-static-or-leaks-might-occur-incominghandler

Merci cs_Julien39 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 97 internautes ce mois-ci

Commenter la réponse de cs_Julien39
Meilleure réponse
3
Merci
Je te remercie encore du temps que tu m'accorde,

J'ai jeter un oeil au site que tu ma proposer. Malgré mes lacune en anglais je crois avoir compris mon problème.

Par contre, pour te dire vrais, j'ai pas compris comment y remédier dans mon cas.

Cela et surement dut a mes lacunes en programmation Java.

Je pence bien que c'est beaucoup te demander, mais dans mon cas je dois faire comment?

1000000 merci et encore désolé du temps que je te fais perdre

Ermal

Merci ErmalF 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 97 internautes ce mois-ci

Commenter la réponse de ErmalF
0
Merci
Quand je les implémentas dans le code source et pas dans la classe BtInterface,une erreur apparait sur les trois qui me dit:

"The method clase() of type MainActivityBluetooth must override a superclass method"

Il me donne comme solution : "Remove `@Override` annotation

Par-contre "public void close()" est appellé dans la class BtInterface qui a été créer.

Ermal
Commenter la réponse de ErmalF
cs_Julien39 6450 Messages postés mardi 8 mars 2005Date d'inscriptionModérateurStatut 17 mai 2018 Dernière intervention - 19 nov. 2012 à 18:58
0
Merci
Je ne maîtrise pas assez la programmation android pour t'aider plus. C'est pour cela qu'au début je ne comprenais pas ton problème, le handler que tu utilises n'est pas celui de java.util.

Par contre, il me semble que dans le post que je t'ai donné, ils proposent une solution.

Et au fond, ce n'est qu'un warning, si fonctionnellement, tout roule, il n'y a pas de problème.
Commenter la réponse de cs_Julien39
0
Merci
Merci beaucoup Julien39, c’était super sympa de ta par de m'avoir aidé

A bientot, qui sais

Ermal
Commenter la réponse de ErmalF

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.