標籤:android 線程 socket
線程中設定UI問題:
Android處於安全考慮,禁止在子線程中隊系統的UI進行操作,因此,需要通過Handler對其進行處理。
在子線程中,當需要進行UI相關操作時,可通過Handler類實現。
1.在主線程中建立Handler,其功能為監聽msg,當收到msg時進行一些操作
public Handler mHandler = new Handler() {public void handleMessage(Message msg) {switch (msg.what) {...}}}2.在子線程中發送msg:
new Thread(new Runnable() {public void run() {try {mHandler.obtainMessage(1).sendToTarget();Thread.sleep(1000);<span style="white-space:pre"></span>}} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}}).start();
實現長按按鈕連續執行操作的效果:
本例中為長按某按鈕時,手機通過TCP持續發送某個命令
public void hookMove(final Activity activity, final String cmd,MotionEvent event) {if (event.getAction() == MotionEvent.ACTION_DOWN) {Toast.makeText(activity, "鉤子開始移動", Toast.LENGTH_SHORT).show();longClicked = true;Thread t = new Thread() {@Overridepublic void run() {super.run();while (longClicked) {// 發送命令TCPControl.sendCMD(cmd);try {Thread.sleep(250);} catch (InterruptedException e) {e.printStackTrace();}}}};t.start();} else if (event.getAction() == MotionEvent.ACTION_UP) {Toast.makeText(activity, "鉤子停止移動", Toast.LENGTH_SHORT).show();longClicked = false;System.out.println("ACTION_UP");}}
hookUp.setOnTouchListener(new OnTouchListener() {@Overridepublic boolean onTouch(View v, MotionEvent event) {// TODO Auto-generated method stubcmd = "12" + strHookSelected + "3";hookMove(activity, cmd, event);return true;}});
判斷手機的socket伺服器的串連狀態:
相對於系統提供的isConnected等函數來說,通過類比Linux中的ping操作效果更好(http://blog.csdn.net/yudajun/article/details/10062339)
代碼功能為向指定ip發送一個ping命令,若成功,則證明socket為串連狀態
private static boolean startPing(String ip) {boolean success = false;Process p = null;try {p = Runtime.getRuntime().exec("ping -c 1 -i 0.2 -W 1 " + ip);int status = p.waitFor();if (status == 0) {success = true;} else {success = false;}} catch (Exception e) {success = false;} finally {p.destroy();}return success;}
Android線程中隊UI進行操作、按鈕長按實現連續發送命令的效果、檢測socket與伺服器串連狀態