我正在尝试开发一个将使用Netty的Android应用程序。
首先,我想在Android上测试Netty,所以我要开发EchoClient示例。
我正在“翻译”客户端部分。这部分有两个类:EchoClient和EchoClientHandler
EchoClient
作为线程运行,EchoClientHandler
处理所有网络内容。
在main方法上,EchoClient
运行如下:
new EchoClient(host, port, firstMessageSize).run();
EchoClientHandler
使用异步事件编程模型。
以下是EchoClient的一段代码:
public void run() {
// Configure the client.
ClientBootstrap bootstrap = new ClientBootstrap(
new NioClientSocketChannelFactory(
Executors.newCachedThreadPool(),
Executors.newCachedThreadPool()));
// Set up the pipeline factory.
bootstrap.setPipelineFactory(new ChannelPipelineFactory() {
public ChannelPipeline getPipeline() throws Exception {
return Channels.pipeline(
new EchoClientHandler(firstMessageSize));
}
});
// Start the connection attempt.
ChannelFuture future = bootstrap.connect(new InetSocketAddress(host, port));
// Wait until the connection is closed or the connection attempt fails.
future.getChannel().getCloseFuture().awaitUninterruptibly();
// Shut down thread pools to exit.
bootstrap.releaseExternalResources();
}
此run()
方法可以是AsyncTask.doBackground()
方法。
正如您所见,EchoClientHandler是此课程的一部分。
这是我想在UI线程中使用的EchoClientHandler方法:
@Override
public void messageReceived(
ChannelHandlerContext ctx, MessageEvent e) {
// Send back the received message to the remote peer.
transferredBytes.addAndGet(((ChannelBuffer) e.getMessage()).readableBytes());
e.getChannel().write(e.getMessage());
}
如何在AsynTask中使用EchoClientHandler?我不知道在调用onProgressUpdate
时如何更新messageReceived
上的TextView。
有什么建议吗?
答案 0 :(得分:0)
也许你可以使用回调。
第1步。定义界面
public interface MyCallback {
public void onMessage(string msg);
}
第2步。在EchoHandler构造函数中获取符合该接口的对象,并将其存储为类变量
private MyCallback _myCallback
public EchoClientHandler(int firstMessageSize, MyCallback callback) {
_myCallback = myCallback;
...
}
第3步。将对象传递给管道中的该构造函数。 myCallback可以来自run()作为参数,也可以来自EchoClient构造函数。
// Set up the pipeline factory.
bootstrap.setPipelineFactory(new ChannelPipelineFactory() {
public ChannelPipeline getPipeline() throws Exception {
return Channels.pipeline(
new EchoClientHandler(firstMessageSize, myCallback));
}
})
第4步。在您的邮件处理程序中调用回调
@Override
public void messageReceived(
ChannelHandlerContext ctx, MessageEvent e) {
// Send back the received message to the remote peer.
transferredBytes.addAndGet(((ChannelBuffer) e.getMessage()).readableBytes());
e.getChannel().write(e.getMessage());
_myCallback.onMessage("message");
}
希望这有帮助。