【问题标题】:Pass data to a running AsyncTask将数据传递给正在运行的 AsyncTask
【发布时间】:2012-06-09 19:15:38
【问题描述】:

我正在开发一个 Android 应用程序。

我想通过一个简单的 echo 客户端来测试异步套接字在 Android 上的工作原理。

Java tutorial我找到了以下代码:

import java.io.*;
import java.net.*;

    public class EchoClient {
        public static void main(String[] args) throws IOException {

            Socket echoSocket = null;
            PrintWriter out = null;
            BufferedReader in = null;

            try {
                echoSocket = new Socket("taranis", 7);
                out = new PrintWriter(echoSocket.getOutputStream(), true);
                in = new BufferedReader(new InputStreamReader(
                                            echoSocket.getInputStream()));
            } catch (UnknownHostException e) {
                System.err.println("Don't know about host: taranis.");
                System.exit(1);
            } catch (IOException e) {
                System.err.println("Couldn't get I/O for "
                                   + "the connection to: taranis.");
                System.exit(1);
            }

        BufferedReader stdIn = new BufferedReader(
                                       new InputStreamReader(System.in));
        String userInput;

        while ((userInput = stdIn.readLine()) != null) {
            out.println(userInput);
            System.out.println("echo: " + in.readLine());
        }

        out.close();
        in.close();
        stdIn.close();
        echoSocket.close();
        }
    }

我想让用户填写一个 EditText,而不是阅读表单 System.in,当用户点击一个按钮时,我想发送用户在该 EditText 上介绍的文本。

另外,我想使用 AsyncTask 来实现。以上代码将在AsyncTask.doBackground()方法上。

我想做以下事情:用户介绍一个文本,然后他点击发送按钮,然后他等待查看响应。当我从 Echo Server 得到响应时,我让用户介绍一个新文本,然后重新开始这个过程。还有一个按钮可以关闭套接字并结束程序。

我的问题是:如何通知有可发送的文本?换句话说,当用户点击发送按钮时,我必须怎么做才能将该文本传递给 AsyncTask?

【问题讨论】:

  • 最简单的解决方案是创建第二个 AsyncTask 并在用户点击第二个按钮时开始运行它。换句话说,每次点击按钮都会触发一个新的 AsyncTask 运行:new MyAsyncTask().execute(userInput);
  • @yorkw 以及如何从AsynkTask 发回数据,并从主要活动中捕获?

标签: android sockets android-asynctask


【解决方案1】:

看起来您正在构建一个聊天应用程序。

  • 要向服务器发送文本,您可以在用户每次单击“发送”按钮时创建一个新的AsyncTask。但请确保在完成操作后停止这些任务。

  • 要接收回复,您可以启动Service 并定期检查您的服务器。每当您收到要显示的新消息时,您都可以向主要活动发送广播。而且,在 Activity 中,您需要创建一个 BroadcastReceiver 对象,该对象侦听来自 Service 的广播。

因此,当您的 BroadcastReceiver 收到来自 Service 的新广播时,请使用您的消息/文本更新消息列表。

【讨论】:

    【解决方案2】:

    AsyncTask 本质上可以让您执行以下操作:

    • 使用一些参数启动任务
    • 以简单的方式为您处理后台线程(您不必担心)
    • 让您以系统的方式将结果发布到 UI 线程。

    在您的情况下,听起来您没有向任务发送数据,而是启动具有指定参数的任务。 p>

    如果您查看AsyncTask documentation 中给出的示例,您会看到模板定义的第一个参数是启动任务的参数集。在您的情况下,您可能希望使用URL(或可能只是字符串)参数。当用户单击按钮时,您启动任务,下载内容,然后将结果发布到 UI 线程!

    【讨论】:

    • 可能是我解释的不好。我想做以下事情:用户介绍文本,然后点击发送按钮,然后等待查看响应。当我从 Echo Server 收到响应时,我让用户介绍一个新文本,然后重新开始该过程。还有另一个按钮可以关闭套接字并结束程序。
    • 如果您有一个不断与服务器通信的后台线程,那么这并不是 AsyncTask 的真正用途。这是相当重量级的,相反,我会考虑使用带有自定义 Messenger/Handler 组合的服务,该组合与服务器对话并通过消息将数据放在 UI 上。 (顺便说一句,这是聊天应用程序中的典型做法。)
    • AsyncTasks 是为 tasks 设计的,相比之下,这不是一个原子任务,而是经常(或至少,公平地)位于后台并与用户通过连接一个活动,这是一个服务的例子。
    • 好的。谢谢你的回答,我试试看。
    • 我正在使用一项服务,但我不知道如何将文本传递给本地服务。如何通过打开的套接字传递文本以发送?我可以调用 startService() 方法吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-04
    • 2013-07-13
    • 1970-01-01
    • 1970-01-01
    • 2011-04-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多