2015-10-02 4 views
0

Я работаю над приложением, которое реализует сервер Web Socket. Я имею в виду эту библиотеку - https://github.com/TooTallNate/Java-WebSocketНачиная новую тему freezes UI

Проблема в том, что нить поддерживает весь пользовательский интерфейс. Вот код -

package com.example.websocket; 

import java.net.InetSocketAddress; 
import java.net.UnknownHostException; 
import java.util.Collections; 

import java.nio.ByteBuffer; 

import org.java_websocket.WebSocket; 
import org.java_websocket.drafts.Draft; 
import org.java_websocket.drafts.Draft_17; 
import org.java_websocket.framing.FrameBuilder; 
import org.java_websocket.framing.Framedata; 
import org.java_websocket.handshake.ClientHandshake; 
import org.java_websocket.server.WebSocketServer; 

import android.os.Bundle; 
import android.provider.Settings.Global; 
import android.app.Activity; 
import android.content.Context; 
import android.view.Menu; 
import android.view.View; 
import android.view.inputmethod.InputMethodManager; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.TextView; 
import android.widget.Toast; 

public class MainActivity extends Activity { 

    EditText port, msg; 
    Button listener, send; 
    TextView status; 
    int p; 
    int count = 0; 
    boolean connect = false; 
    boolean listen = false; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     msg = (EditText)findViewById(R.id.editText2); 
     listener = (Button)findViewById(R.id.button1); 
     send = (Button)findViewById(R.id.button2); 
     status = (TextView)findViewById(R.id.textView1); 

     listener.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Thread t = new Thread(new Runnable() { 
        @Override 
        public void run() { 
         try { 
          SimpleServer server = new SimpleServer(); 
          server.start(); 
          status.setText("Working inside Thread"); 
         } catch (UnknownHostException e) { 
          e.printStackTrace(); 
         } 
        } 
       }); 

       t.start(); 
      } 
     }); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 

    public class SimpleServer extends WebSocketServer { 

     public SimpleServer() throws UnknownHostException { 
      super(new InetSocketAddress(9998)); 
      // TODO Auto-generated constructor stub 
     } 

     @Override 
     public void onClose(WebSocket arg0, int arg1, String arg2, boolean arg3) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void onError(WebSocket arg0, Exception arg1) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void onMessage(WebSocket arg0, String arg1) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void onOpen(WebSocket arg0, ClientHandshake arg1) { 
      status.setText("Working"); 

     } 

    } 

} 
+0

Не похоже, что он должен блокировать поток, но это может привести к его краху. Вы не должны вызывать 'status.setText (...)' вне основного потока. –

+0

Да, да. Приложение по-прежнему резко отключается. – apoorvasomani

+0

Я отредактировал свой предыдущий комментарий о том же времени, когда вы ответили. «Отключается резко» сильно отличается от «зависает UI». Если он рухнет, это, вероятно, по той причине, о которой я сказал. –

ответ

1

Вы не можете обновить пользовательский интерфейс от других потоков:

status.setText("Working inside Thread"); 

использование runOnUiThread метод деятельности

runOnUiThread(new Runnable() { 

        @Override 
        public void run() { 
         status.setText("Working inside Thread"); 
        } 
       }); 

Кстати Youre код причины памяти leack и сбои. Вы не можете начинать длительные жизненные операции в контексте деятельности. Вы должны запустить службу или сделать этот поток в контексте приложения, результаты, которые вы можете пройти, используя EventBus.

Смежные вопросы