您好,登錄后才能下訂單哦!
先介紹下Autobahn Android是什么東西,簡單來說,就是github上的一個開源項目,目的是在Android端實現WebSocket的協議,項目的地址在這里,看得懂源碼的童鞋可以去看,地址點這里,貌似還有些發布/訂閱 模式的東西在里面。
接下來說下,我要實現的目標,首先我要建立一個全局的持續連接,以保證在每個Activity中,都能調用它的發送數據的方法
WebSocketUitls.webSocketConnection.sendTextMessage(jsonObject.toString());
當然另一點就是,在發送數據后,能在接收返回數據的時能在當前的上下文環境當中執行相應的方法
@Override public void mySystemMethod(JSONObject json){ try { System.out.println(json.get("data") + "_LoginPage"); userName = (EditText)findViewById(R.id.userName); userName.setText(json.get("data").toString()); } catch (JSONException e) { e.printStackTrace(); } }
------------------------------------分割線------------------------------------------------
首先,我定義了一個工具類,將WebSocket連接對象進行全局化,并定義一個繼承了MyWebSocketHandler接口的偽處理類,并在全局的返回數據的 public void onTextMessage(String payload)中調用,這樣當其他Activity類,new MyWebSocketHandler時,便可以替換onTextMessage中的方法,以實現回調的效果
public class WebSocketUitls{ public static String WS = "ws://ip地址:端口號"; public static WebSocketConnection webSocketConnection; public static WebSocketHandler webSocketHandler; static { webSocketConnection = new WebSocketConnection(); webSocketHandler = new WebSocketHandler(){ //websocket接受返回數據的方法 @Override public void onTextMessage(String payload) { super.onTextMessage(payload); //調用自定義方法中的mySystemMethod,當其他Activity中重置他的時候就會完成替換 JSONObject jsonObject; try { jsonObject = new JSONObject(payload); //要替換的方法 myHandler.mySystemMethod(jsonObject); } catch (JSONException e) { e.printStackTrace(); } } }; try { webSocketConnection.connect(WS,webSocketHandler); } catch (WebSocketException e) { e.printStackTrace(); } } //定義一個初始的全局類 public static MyWebSocketHandler myHandler = new MyWebSocketHandler(){ @Override public void mySystemMethod(JSONObject json) { //TODO 并沒什么卵用。這個方法只是占個位置,以方便以后替代 } }; }
public class LoginPage extends AppCompatActivity{ private EditText userName; @Override protected void onResume() { super.onResume(); //將新的方法傳遞給myHandler這全局的處理方法 WebSocketUitls.myHandler = new LoginHandler(); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_login_page); Button login_btn = (Button)findViewById(R.id.LOGIN_IN); login_btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { final Map<String,String> map = new HashMap<String,String>(); map.put("type","XXXXXXXXX"); map.put("name","111111"); map.put("password", "111111"); final JSONObject jsonObject = new JSONObject(map); //組合數據,這是websocket的請求參數 WebSocketUitls.webSocketConnection.sendTextMessage(jsonObject.toString()); } }); } //實現一個內部類,同時實現MyWebSocketHandler這個接口, class LoginHandler implements MyWebSocketHandler{ //實現這個方法,以替換全局的處理方法 @Override public void mySystemMethod(JSONObject json){ try { System.out.println(json.get("data") + "_LoginPage"); userName = (EditText)findViewById(R.id.userName); userName.setText(json.get("data").toString()); } catch (JSONException e) { e.printStackTrace(); } } } }
public interface MyWebSocketHandler { public void mySystemMethod(JSONObject json); }
--------------------------------------分割線----------------------------------------------
可能說的不太有條理, 畢竟能力有限,有哪位大神用過這個東西,有自己的見解的可以在留言中提出來。
另附上autobahn-0.5.0.jar包。有需要的可以拿去用在自己的項目當中,只用一個,其他網上下載的東西,可能會有兩個依賴吧,其實并,不需要,加進去也會編譯出錯,所以只加入這也個就可以了。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。