0

Netty 通信クラスは標準の Java アプリケーションでは正常に動作しますが、Android アプリケーションで実行すると NullPointerException が発生します。

私の質問は、Netty の専門家がこれを解決するための正しい方向性を指摘できるかどうかです。それは Android との非互換性の問題ですか、それともスタック トレースで、私が間違っている可能性があることを示している可能性がありますか?

私は使っているnetty-3.4.0.Final.jar

にインターネット権限を追加しましたAndroidManifest.xml
Androidアプリで(Nettyなしで)生のソケットだけを使用してサーバーに正常に接続できることを確認しました。

呼び出した後bootstrap.connect()、2 つのスレッドのブレークポイントで実行を中断できます。1exceptionCaught()つと 1 つchannelClosed()

以下のスタック トラックは、例外からのものですexceptionCaught()

このプロジェクトの完全なソースはcodeplex、 にありelvemobileandroid projectます。

例外が常にスローされるとは限らないことを示す可能性がある Android プロジェクトの動作を実際に見たことがあると思います。残念ながら、私はそれを再び機能させることができませんでした (プロジェクトに変更を加えていませんが)。

Thread [<1> main] (Suspended (breakpoint at line 172 in UptimeClientHandler))   
    UptimeClientHandler.exceptionCaught(ChannelHandlerContext, ExceptionEvent) line: 172    
    UptimeClientHandler(SimpleChannelUpstreamHandler).handleUpstream(ChannelHandlerContext, ChannelEvent) line: 117 
    DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline$DefaultChannelHandlerContext, ChannelEvent) line: 564    
    DefaultChannelPipeline$DefaultChannelHandlerContext.sendUpstream(ChannelEvent) line: 792    
    ReadTimeoutHandler(SimpleChannelUpstreamHandler).exceptionCaught(ChannelHandlerContext, ExceptionEvent) line: 143   
    ReadTimeoutHandler(SimpleChannelUpstreamHandler).handleUpstream(ChannelHandlerContext, ChannelEvent) line: 117  
    DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline$DefaultChannelHandlerContext, ChannelEvent) line: 564    
    DefaultChannelPipeline.sendUpstream(ChannelEvent) line: 559 
    Channels.fireExceptionCaught(Channel, Throwable) line: 533  
    NioClientSocketPipelineSink.connect(NioClientSocketChannel, ChannelFuture, SocketAddress) line: 152 
    NioClientSocketPipelineSink.eventSunk(ChannelPipeline, ChannelEvent) line: 97   
    DefaultChannelPipeline.sendDownstream(ChannelEvent) line: 574   
    Channels.connect(Channel, SocketAddress) line: 642  
    NioClientSocketChannel(AbstractChannel).connect(SocketAddress) line: 204    
    ClientBootstrap.connect(SocketAddress, SocketAddress) line: 230 
    ClientBootstrap.connect(SocketAddress) line: 183    
    ClientBootstrap.connect() line: 154 
    UptimeClient.run() line: 94 
    CommunicationTest.test() line: 32   
    ElveMobileActivity.onCreate(Bundle) line: 25    
    Instrumentation.callActivityOnCreate(Activity, Bundle) line: 1047   
    ActivityThread.performLaunchActivity(ActivityThread$ActivityRecord, Intent) line: 2627  
    ActivityThread.handleLaunchActivity(ActivityThread$ActivityRecord, Intent) line: 2679   
    ActivityThread.access$2300(ActivityThread, ActivityThread$ActivityRecord, Intent) line: 125 
    ActivityThread$H.handleMessage(Message) line: 2033  
    ActivityThread$H(Handler).dispatchMessage(Message) line: 99 
    Looper.loop() line: 123 
    ActivityThread.main(String[]) line: 4627    
    Method.invokeNative(Object, Object[], Class, Class[], Class, int, boolean) line: not available [native method]  
    Method.invoke(Object, Object...) line: 521  
    ZygoteInit$MethodAndArgsCaller.run() line: 868  
    ZygoteInit.main(String[]) line: 626 
    NativeStart.main(String[]) line: not available [native method]  

これは、stackoverflow に関する私の最初の投稿です。他に提供できる情報があればお知らせください。

ありがとう

4

1 に答える 1

1

logcat ウィンドウを指摘してくれてありがとう (Eclipse は初めてです)。別のエラーが表示されました: java.net.SocketException: Bad address family

いくつかの調査を行った後、これを見つけました: http://code.google.com/p/android/issues/detail?id=9431

修正は、エミュレーターの使用時に IPv6 を無効にすることです。

java.lang.System.setProperty("java.net.preferIPv6Addresses", "false");
于 2012-04-24T07:48:26.150 に答える