EditText не показывать текст - PullRequest
0 голосов
/ 03 ноября 2011

Я пытаюсь показать текст в EditText, но ничего не показывать, код такой:

public void run() 
{
    String mensaje;
    while(true)
    {
      try 
      {
        mensaje = b.readLine();
        Log.d("mensaje", mensaje);
       _et_ip.setText(mensaje);
      } 
      catch (IOException e){e.printStackTrace();}
   }
 }

Основной класс реализует выполняемые

public class ClienteTcpAnroid extends Activity implements Runnable

и Log.dпоказать сообщение правильно, но _et_ip.setText (mensaje) не показывать сообщение.

Я использую эмулятор Android

Большое спасибо

Это весь код:

public class ClienteTcpAnroid extends Activity implements Runnable
{

private static  String myIP;
private static String myPort;
String mensaje;
Thread threadProcesaAlarmas;
public TextView _tv_estado;
    public EditText _et_ip;
    public EditText _et_port;
    public Button botonConectar;
    BufferedReader b;

    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        _tv_estado = (TextView)findViewById(R.id.tv_estado);
        _et_ip = (EditText)findViewById(R.id.et_ip);
        _et_port = (EditText)findViewById(R.id.et_port);
        botonConectar = (Button)findViewById(R.id.button1);

        botonConectar.setOnClickListener(new View.OnClickListener() 
        {            
         public void onClick(View v)
             { 
                Socket mySocket;
            PrintStream p;
            try 
            {
                mySocket = new Socket("192.168.1.35", 12345);
    b = new BufferedReader(new InputStreamReader(mySocket.getInputStream()));
                threadProcesaAlarmas = new Thread(ClienteTcpAnroid.this);
                threadProcesaAlarmas.start();
            } 
            catch (IOException e)
            {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }); 
}

@Override
public void run() 
{
    String mensaje;
    while(true)
    {
        try 
        {
            mensaje = b.readLine();
            Log.d("mensaje", mensaje);
            _et_ip.setText(mensaje);
        } 
        catch (IOException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }
}
}

Большое спасибо

Это журнал:

11-03 20:01:08.507: D/mensaje(957): mensaje0  
11-03 20:01:08.507: W/dalvikvm(957): threadid=9: thread exiting with uncaught exception (group=0x40015560)
11-03 20:01:08.536: E/AndroidRuntime(957): FATAL EXCEPTION: Thread-10
11-03 20:01:08.536: E/AndroidRuntime(957):   android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
11-03 20:01:08.536: E/AndroidRuntime(957):  at android.view.ViewRoot.checkThread(ViewRoot.java:2932)
11-03 20:01:08.536: E/AndroidRuntime(957):  at android.view.ViewRoot.invalidateChild(ViewRoot.java:642)
11-03 20:01:08.536: E/AndroidRuntime(957):  at android.view.ViewRoot.invalidateChildInParent(ViewRoot.java:668)
11-03 20:01:08.536: E/AndroidRuntime(957):  at android.view.ViewGroup.invalidateChild(ViewGroup.java:2511)
11-03 20:01:08.536: E/AndroidRuntime(957):  at android.view.View.invalidate(View.java:5255)
11-03 20:01:08.536: E/AndroidRuntime(957):  at android.widget.TextView.invalidateCursor(TextView.java:3683)
11-03 20:01:08.536: E/AndroidRuntime(957):  at android.widget.TextView.spanChange(TextView.java:6390)
11-03 20:01:08.536: E/AndroidRuntime(957):  at android.widget.TextView$ChangeWatcher.onSpanAdded(TextView.java:6515)
11-03 20:01:08.536: E/AndroidRuntime(957):  at android.text.SpannableStringBuilder.sendSpanAdded(SpannableStringBuilder.java:906)
11-03 20:01:08.536: E/AndroidRuntime(957):  at android.text.SpannableStringBuilder.setSpan(SpannableStringBuilder.java:611)
11-03 20:01:08.536: E/AndroidRuntime(957):  at android.text.SpannableStringBuilder.setSpan(SpannableStringBuilder.java:514)
11-03 20:01:08.536: E/AndroidRuntime(957):  at android.text.Selection.setSelection(Selection.java:74)
11-03 20:01:08.536: E/AndroidRuntime(957):  at android.text.Selection.setSelection(Selection.java:85)
11-03 20:01:08.536: E/AndroidRuntime(957):  at android.text.method.ArrowKeyMovementMethod.initialize(ArrowKeyMovementMethod.java:268)
11-03 20:01:08.536: E/AndroidRuntime(957):  at android.widget.TextView.setText(TextView.java:2712)
11-03 20:01:08.536: E/AndroidRuntime(957):  at android.widget.TextView.setText(TextView.java:2592)
11-03 20:01:08.536: E/AndroidRuntime(957):  at android.widget.EditText.setText(EditText.java:78)
11-03 20:01:08.536: E/AndroidRuntime(957):  at android.widget.TextView.setText(TextView.java:2567)
11-03 20:01:08.536: E/AndroidRuntime(957):  at packag.Android.ClienteTcpAnroid.run(ClienteTcpAnroid.java:80)
11-03 20:01:08.536: E/AndroidRuntime(957):  at java.lang.Thread.run(Thread.java:1019)
11-03 20:01:08.566: W/ActivityManager(77):   Force finishing activity packag.Android/.ClienteTcpAnroid
11-03 20:01:08.767: W/IInputConnectionWrapper(957): showStatusIcon on inactive InputConnection

Спасибо, Кевин

1 Ответ

1 голос
/ 03 ноября 2011

OK.Проблема № 1, вы едите свои исключения.Я почти уверен (хотя, может быть, он изменился?) E.printStackTrace () ничего не делает.Вам нужно либо зарегистрировать их с помощью Log, либо обернуть и выбросить с помощью RuntimeException (я предпочитаю потерпеть неудачу, чем тихо игнорировать, поэтому я выбрал последнее).

У вас есть 2 способа сделать это (ну, несколько, номы обсудим 2).

1) Сделайте фоновую работу в AsyncTask.Я бы выбрал это.Гораздо проще, чем создавать / управлять собственным потоком.

2) Сохраняйте свой код, но когда вы обновляете пользовательский интерфейс, делайте это с помощью обработчика, созданного в потоке пользовательского интерфейса.

public class ClienteTcpAnroid extends Activity implements Runnable
{

    private static String myIP;
    private static String myPort;
    String mensaje;
    Thread threadProcesaAlarmas;
    public TextView _tv_estado;
    public EditText _et_ip;
    public EditText _et_port;
    public Button botonConectar;
    BufferedReader b;
    private Handler handler;

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        _tv_estado = (TextView) findViewById(R.id.tv_estado);
        _et_ip = (EditText) findViewById(R.id.et_ip);
        _et_port = (EditText) findViewById(R.id.et_port);
        botonConectar = (Button) findViewById(R.id.button1);

        botonConectar.setOnClickListener(new View.OnClickListener()
        {
            public void onClick(View v)
            {
                Socket mySocket;
                PrintStream p;
                try
                {
                    mySocket = new Socket("192.168.1.35", 12345);
                    b = new BufferedReader(new InputStreamReader(mySocket.getInputStream()));
                    threadProcesaAlarmas = new Thread(ClienteTcpAnroid.this);
                    threadProcesaAlarmas.start();
                }
                catch (IOException e)
                {
                    throw new RuntimeException(e);
                }
            }
        });

        handler = new Handler();
    }

    @Override
    public void run()
    {
        while (true)
        {
            try
            {
                final String mensaje = b.readLine();
                Log.d("mensaje", mensaje);
                handler.post(new Runnable()
                {
                    public void run()
                    {
                        _et_ip.setText(mensaje);
                    }
                });
            }
            catch (IOException e)
            {
                throw new RuntimeException(e);
            }

        }
    }
}

Я предполагаю, что чтение сокета блокируется.Конечно, у вас есть «бесконечный цикл», но это не имеет большого значения, поскольку он блокирует.Единственное, что я бы посоветовал, это выяснить, как обрезать это в onPause.

Кроме того, кстати, забудьте об AsyncTask здесь.До сих пор не понял, что именно ты пытался сделать.Нить - это путь.Ну, я думаю, что Служба - это путь, но это сработает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...