Netty框架或如何将其与AsyncTask一起使用

时间:2012-06-09 16:33:29

标签: android multithreading asynchronous android-asynctask netty

我正在尝试开发一个将使用Netty的Android应用程序。

首先,我想在Android上测试Netty,所以我要开发EchoClient示例。

我正在“翻译”客户端部分。这部分有两个类:EchoClientEchoClientHandler

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。

有什么建议吗?

1 个答案:

答案 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");
}

希望这有帮助。