Les Handler

Résolu
ErmalF - 19 nov. 2012 à 14:50
 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

11 réponses

cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
19 nov. 2012 à 14:56
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.
3
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
3
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
3
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
19 nov. 2012 à 15:43
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) {
}
3

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
19 nov. 2012 à 16:05
clase -> close

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

import java.util.logging.Handler;
3
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
3
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
19 nov. 2012 à 16:34
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
3
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
3
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
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
19 nov. 2012 à 18:58
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.
0
Merci beaucoup Julien39, c’était super sympa de ta par de m'avoir aidé

A bientot, qui sais

Ermal
0
Rejoignez-nous