2015-10-02 94 views
0

我正在研究一個實現Web Socket服務器的應用程序。我指的是這個庫 - https://github.com/TooTallNate/Java-WebSocket開始新線程凍結UI

問題是線程阻擋了整個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"); 
        } 
       }); 

的方法順便說您選擇的代碼導致內存leack和崩潰。您不能在活動環境中開始長期生活操作。您應該運行服務,或在應用程序上下文中創建此線程,並使用EventBus傳遞結果。