在编写android项目时,我们可以通过Log去查看程序的执行状态和打印信息。
然而在ANE中这些Log的内容是无法通过控制台看到的,也就是说程序在android部分出错了我们很难知道程序是在那一步出错了。那么应该用什么来替代Log呢? 日前我就遇到了这样的问题,我的解决方案是是使用Socket。
这个方法主要包含2个部分
1.客户端--------代码会写在android部分
2.服务器--------任何能实现SocketService的都可以,由于对flash熟悉且对性能方面无要求我使用的是air
服务器的实现是简单到不能再简单将收到的信息打印出来,由于代码很少我直接全部粘贴了,相信不需要注释也是能读懂的
package
{
import flash.display.Sprite;
import flash.events.ProgressEvent;
import flash.events.ServerSocketConnectEvent;
import flash.net.ServerSocket;
import flash.net.Socket;
import flash.text.TextField;
import flash.utils.ByteArray;
public class TestSocketServices extends Sprite
{
private var ss:ServerSocket;
private var tf:TextField;
private var cs:Socket;
public function TestSocketServices()
{
initSS();
}
private function initSS():void
{
ss = new ServerSocket();
ss.bind(5689);
ss.addEventListener(ServerSocketConnectEvent.CONNECT, onConnect);
ss.listen();
tf = new TextField();
addChild(tf);
tf.width = stage.stageWidth;
tf.height = stage.stageHeight;
tf.border = true;
tf.borderColor = 0;
tf.wordWrap = tf.multiline = true;
}
private function log(msg:String):void
{
tf.appendText(msg + "\n");
trace(msg);
}
protected function onConnect(event:ServerSocketConnectEvent):void
{
cs = event.socket;
cs.addEventListener(ProgressEvent.SOCKET_DATA, getData);
}
protected function getData(event:ProgressEvent):void
{
if(cs.bytesAvailable)
{
var ba:ByteArray = new ByteArray();
cs.readBytes(ba, 0, cs.bytesAvailable);
log("msg from android:" + ba.toString());
}
}
}
}
客户端的代码更是简单,我也完全粘贴吧
package com.example.sockets;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
public class SocketLog {
private static SocketLog _ins;
private Socket cs;
PrintWriter out;
public SocketLog()
{
try {
cs = new Socket("192.168.1.32", 5689);
out = new PrintWriter(cs.getOutputStream());
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public static SocketLog ins()
{
if(_ins == null)
{
_ins = new SocketLog();
}
return _ins;
}
public void log(String msg)
{
out.print(msg);
out.flush();
}
}
需要注意的是IP地址和端口号需要根据实际情况进行设置。
接下来是如何使用,其实也很简单
只需要将android中的log(...)的代码替换成SocketLog.ins().log(...)就可以了。
看看实际的效果吧
最后要说明的一点很重要。当运行程序的时候发现程序一直启动不起来很有可能是你的服务器没有启动,程序一直在连接服务器导致。所以测试的时候记得开服务器,发布的时候记得将相关代码去除!