2015-06-15 59 views

回答

0

首先定义一个抽象类

public abstract class FirebugConsole extends OutputStream { 

    abstract void log(String msg); 

    StringBuilder sb = new StringBuilder(); 

    @Override 
    public void write(int i) { 
    sb.append((char)i); 
    } 

    @Override 
    public void flush() { 
    if(sb.length() >0 && !sb.toString().equals("\r\n")) 
     log(sb.toString()); 
    sb = new StringBuilder(); 
    } 
} 

然后用实现本机调用入JavaScript方法扩展它。这里有一个例子,如何写日志消息

public class FirebugConsoleInfo extends FirebugConsole{ 
    @net.java.html.js.JavaScriptBody(args = { "msg" }, body = "" 
     + "Firebug.Console.log(msg);") 
    public native void log(String msg); 
} 

最后,管System.out和System.err的那些对象

public static void onPageLoad() throws Exception { 
    ... 
     System.setOut(new PrintStream(new FirebugConsoleInfo(), true)); 
     System.setErr(new PrintStream(new FirebugConsoleError(), true)); 
    ... 
    } 

注:因为某些原因通常console.log()不为我工作,我知道如果控制台对象已经存在,Firebug不会绑定控制台,所以我怀疑WebFX webview本身必须首先将console.log消息传递给System.out。

更新

上述解决方案时不是浏览器的其他线程正在生成的消息不起作用。这是基于BrwsrCtx.execute()

public abstract static class FirebugConsole extends OutputStream { 
    protected final BrwsrCtx ctx; 

    public FirebugConsole(BrwsrCtx ctx){ 
     this.ctx = ctx; 
    } 
    abstract void logNative(String msg); 

    void log(String msg) { 
     ctx.execute(new Runnable(){ 
     @Override 
     public void run() { 
      logNative(msg); 
     } 
     }); 
    } 

    StringBuilder sb = new StringBuilder(); 

    @Override 
    public void write(int i) { 
     sb.append((char)i); 
    } 

    @Override 
    public void flush() { 
     if(sb.length() >0 && !sb.toString().equals("\r\n")) 
     log(sb.toString()); 
     sb = new StringBuilder(); 
    } 
    } 

    public static class FirebugConsoleInfo extends FirebugConsole{ 
    public FirebugConsoleInfo(BrwsrCtx ctx) { 
     super(ctx); 
    } 

    @net.java.html.js.JavaScriptBody(args = { "msg" }, body = "" 
     + "Firebug.Console.log(msg);") 
    public native void logNative(String msg); 

    } 

    public static class FirebugConsoleError extends FirebugConsole{ 
    public FirebugConsoleError(BrwsrCtx ctx) { 
     super(ctx); 
    } 

    @net.java.html.js.JavaScriptBody(args = { "msg" }, body = "" 
     + "Firebug.Console.error(msg);") 
    public native void logNative(String msg); 
    } 
} 

public static void onPageLoad() throws Exception { 
     BrwsrCtx ctx = BrwsrCtx.findDefault(GoGPS_Fx.class); 
     System.setOut(new PrintStream(new FirebugConsoleInfo(ctx), true)); 
     System.setErr(new PrintStream(new FirebugConsoleError(ctx), true)); 
    } 

注意更新的解决方案:它是大原木相当缓慢,有可能会更快的替代品(StringWriter的是一个)。但我怀疑瓶颈在于将消息从Java传递到JavaScript。

相关问题