¿Qué está causando que este botón se bloquee?

Estoy escribiendo una aplicación que me permite enviar un comando a través de TCP/IP haciendo clic en un botón. Sin embargo, cuando hago clic en el botón del emulador, aparece un mensaje que dice que el botón dejó de funcionar. Me preguntaba si alguien podría detectar el error en mi código.

CÓDIGO:

package button.test;  
import java.io.IOException;  
import java.io.OutputStream;  
import java.net.Socket;  
import java.net.UnknownHostException;  
import android.app.Activity;  
import android.os.Bundle;
import android.view.View;  

public class ButtonActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
    public void onClick(View view) throws UnknownHostException, IOException
    {
        Socket socket = new Socket("192.168.2.92", 60128);
        try{
            dataOutputStream.Object BUFFER = null;
            write(BUFFER);
            String buffer="ISCP000000100000000701000000!1PWR010D";
            OutputStream os=socket.getOutputStream();
            os.write(buffer.getBytes()); 
        } catch(IOException e)
        {
            //error code
        }

    }
    private void write(Object BUFFER) {
        // TODO Auto-generated method stub

    }
}

preguntado el 28 de julio de 12 a las 12:07

¿Dónde está el botón? Tienes que establecer un determinado onclickListener al botón que desee. Usa algo como: Button myBtn = (Button) findViewById(R.id.your_btn_id); "encuentra" tu botón y establece el oyente en él. -

4 Respuestas

1. Te perdiste declarar el botón e inicializarlo...

P.ej:

public class ButtonActivity extends Activity {

Button mbutt;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        mbutt = (Button)findViewById(R.id.Button_Click);
    }

- Toma nota de que debe inicializar las vistas solo después de setContentView(), de lo contrario tu las vistas no obtendrán la identificación y haré su aplicación para bloquear.

2. Siempre es recomendable mantener el trabajo de la interfaz de usuario en el hilo de la interfaz de usuario y el trabajo que no es de la interfaz de usuario en el hilo que no es de la interfaz de usuario, pero eso Se convirtió en ley con la llegada de la versión Android HoneyComb.

3. Puedes usar Thread with a Handler para sincronizar la interfaz de usuario y el subproceso que no es de interfaz de usuario.

4. AsyncTask que se conoce como Enhebrado indoloro se introdujo especialmente en Android para esto.

Vea este enlace para tutoriales sobre Hilos, controladores y AsyncTask:

http://www.vogella.com/articles/AndroidPerformance/article.html

Respondido 28 Jul 12, 12:07

Parece que el trabajo de conexión del zócalo está tardando mucho. Sugiera poner esta funcionalidad dentro de una AsyncTask.

Respondido 28 Jul 12, 12:07

No has declarado tu botón en onCreate()

Respondido 28 Jul 12, 12:07

No necesita declarar el botón si está inflando un xml. Su problema es que ejecuta una conectividad de red en un subproceso principal que no está permitido desde api 11. Use una tarea asincrónica o un subproceso para esto.

p.ej

new Thread() {
public void run() {
    Socket socket = new Socket("192.168.2.92", 60128);
    try{
        dataOutputStream.Object BUFFER = null;
        write(BUFFER);
        String buffer="ISCP000000100000000701000000!1PWR010D";
        OutputStream os=socket.getOutputStream();
        os.write(buffer.getBytes()); 
    } catch(IOException e)
    {
        //error code
    }
  }
}.start();

Respondido 28 Jul 12, 12:07

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.