如何从 AsyncTasks doInBackground() 检索数据?

2024-03-05

我会尽可能让这个简单。

我的控制层中有一个使用类的方法CallServiceTask延伸AsyncTask。当调用新的CallServiceTask().execute(parameters)
如何检索从返回的数据doInBackground?我发现的所有教程都使用扩展的类AsyncTask直接来自他们的Activity.
我的问题比这更复杂一点。
我想要的只是采取Object[]由返回doInBackground并将其设置为我的私有数据成员RestClient class.

CallServiceTask看起来像这样:

    private class CallServiceTask extends AsyncTask<Object, Void, Object[]>
{

    protected Object[] doInBackground(Object... params) 
    {
        HttpUriRequest req = (HttpUriRequest) params[0];
        String url = (String) params[1];

        return executeRequest(req, url);
    }
}

我的 RestClient 类如下所示:

public class RestClient
{

private ArrayList <NameValuePair> params;
private ArrayList <NameValuePair> headers;

private JSONObject jsonData;

private Object[] rtnData;

private String url;

private boolean connError;

public int getResponseCode() {
    return responseCode;
}

/**
 * 
 * @return  the result of whether the login was successful by looking at the response parameter of the JSON object. 
 */
public Boolean DidLoginSucceed()
{
    // Will Crash on socket error
        return ((JSONObject) rtnData[0]).optBoolean("response");
}

public String GetToken()
{
    return jsonData.optString("token");
}

public RestClient(String url)
{
    this.url = url;
    params = new ArrayList<NameValuePair>();
    headers = new ArrayList<NameValuePair>();
    rtnData = new Object[]{ new JSONObject() , Boolean.TRUE  };
}

public void AddParam(String name, String value)
{
    params.add(new BasicNameValuePair(name, value));
}

public void AddHeader(String name, String value)
{
    headers.add(new BasicNameValuePair(name, value));
}

/**
 * This method will execute, call the service and instantiate the JSON Object through executeRequest().
 * 
 * @param method    an enum defining which method you wish to execute.
 * @throws Exception
 */
public void ExecuteCall(RequestMethod method) throws Exception
{
    Object[] parameters = new Object[]{ new HttpGet() , new String("") };
    switch(method) {
        case GET:
        {
            //add parameters
            String combinedParams = "";
            if(!params.isEmpty()){
                combinedParams += "?";
                for(NameValuePair p : params)
                {
                    String paramString = p.getName() + "=" + URLEncoder.encode(p.getValue());
                    if(combinedParams.length() > 1)
                    {
                        combinedParams  +=  "&" + paramString;
                    }
                    else
                    {
                        combinedParams += paramString;
                    }
                }
            }

            HttpGet request = new HttpGet(url + combinedParams);

            //add headers
            for(NameValuePair h : headers)
            {
                request.addHeader(h.getName(), h.getValue());
            }
            parameters[0] = request;
            parameters[1] = url;

            new CallServiceTask().execute(parameters);

            jsonData = ((JSONObject) rtnData[0]).optJSONObject("data");
            connError = (Boolean) rtnData[1];
            break;

        }
        case POST:
        {
            HttpPost request = new HttpPost(url);

            //add headers
            for(NameValuePair h : headers)
            {
                request.addHeader(h.getName(), h.getValue());
            }

            if(!params.isEmpty()){
                request.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));
            }
            new CallServiceTask().execute(request, url);
            break;
        }
    }
}

private Object[] executeRequest(HttpUriRequest request, String url)
{
    HttpClient client = new DefaultHttpClient();
    client = getNewHttpClient();

    HttpResponse httpResponse;

    try {
        httpResponse = client.execute(request);
        HttpEntity entity = httpResponse.getEntity();

        if (entity != null) {

            InputStream instream = entity.getContent();
            String response = convertStreamToString(instream);
            try {
                rtnData[0] = new JSONObject(response);
                rtnData[1] = false;

            } catch (JSONException e1) {
                rtnData[1] = true;
                e1.printStackTrace();
            }

            // Closing the input stream will trigger connection release
            instream.close();
        }

    } catch (ClientProtocolException e)  {
        client.getConnectionManager().shutdown();
        e.printStackTrace();
    } catch (IOException e) {
        client.getConnectionManager().shutdown();
        e.printStackTrace();
    }
    return rtnData;
}


private static String convertStreamToString(InputStream is) {

    BufferedReader reader = new BufferedReader(new InputStreamReader(is));
    StringBuilder sb = new StringBuilder();

    String line = null;
    try {
        while ((line = reader.readLine()) != null) {
            sb.append(line + "\n");
        }
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            is.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    return sb.toString();
}

/**
 * Custom HTTP Client accepting all SSL Certified Web Services.
 * 
 * @return n HttpClient object.
 */
public HttpClient getNewHttpClient() {
    try {
        KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
        trustStore.load(null, null);

        SSLSocketFactory sf = new MySSLSocketFactory(trustStore);
        sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);

        HttpParams params = new BasicHttpParams();
        HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
        HttpProtocolParams.setContentCharset(params, HTTP.UTF_8);

        SchemeRegistry registry = new SchemeRegistry();
        registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
        registry.register(new Scheme("https", sf, 443));

        ClientConnectionManager ccm = new ThreadSafeClientConnManager(params, registry);

        return new DefaultHttpClient(ccm, params);
    } catch (Exception e) {
        return new DefaultHttpClient();
    }
}

执行此操作的唯一方法是使用回调。你可以这样做:

new CallServiceTask(this).execute(request, url);

然后在 CallServiceTask 中添加一个本地类变量,并在 onPostExecute 中调用该类的方法:

private class CallServiceTask extends AsyncTask<Object, Void, Object[]>
{
    RestClient caller;

    CallServiceTask(RestClient caller) {
        this.caller = caller;
    }


    protected Object[] doInBackground(Object... params) 
    {
        HttpUriRequest req = (HttpUriRequest) params[0];
        String url = (String) params[1];
        return executeRequest(req, url);
    }

    protected onPostExecute(Object result) {
        caller.onBackgroundTaskCompleted(result);
    }
}

然后只需在中使用该对象即可onBackgroundTaskCompleted()RestClient 类中的方法。

更优雅和可扩展的解决方案是使用接口。有关示例实现,请参阅this https://github.com/sfarooq/A-droid-lib图书馆。我刚刚开始,但它有一个你想要的例子。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从 AsyncTasks doInBackground() 检索数据? 的相关文章

随机推荐

  • 如何使 WPF 滑块拇指从任意点跟随光标

    我有这样的滑块
  • Google Spreadsheet API 插入图像

    有没有办法通过谷歌电子表格API插入图像 我查看了文档 但除了插入 更新 删除行之外 没有提及与工作表相关的其他数据 例如图像 例如 在 Excel 上 图像附加到工作表而不是任何特定单元格 因此 您必须从工作表中插入删除图像 然后将其放置
  • 如何在 Ubuntu Web 服务器上为 Dart 安装 pub(命令行使用)

    我已按照说明进行操作 在 Linux 选项卡下 将 Dart 安装到 Ubuntu Web 服务器上 Dart 本身工作正常 但我无法使用 Pub 命令 仅限 Dart 命令 如何为服务器安装 Pub 以下是使用 Aptitude apt
  • Google Assistant Dialogflow API V2 webhook ETag 错误

    我正在尝试返回简单的文本响应并使用以下代码在 Google Assistant 应用程序中显示基本卡片 public GoogleCloudDialogflowV2WebhookResponse Search GoogleCloudDial
  • Hadoop 块大小 vs 分割 vs 块大小

    我对 Hadoop 的概念有点困惑 有什么区别Hadoop Chunk size Split size and Block size 提前致谢 块大小和块大小是一样的 分体尺寸可能不同于块 块 size 地图缩减算法不适用于文件的物理块 它
  • 获取当月第一天的最有效方法是什么?

    使用 ruby 我尝试将日期格式化为 2009 10 01 我采用当前日期 2009 10 26 然后将日期更改为 01 我知道有多种方法可以做到这一点 但很好奇从代码角度来看 实现这一目标的最短方法是什么 如果您不介意在应用程序中包含 A
  • 如何使用鼠标滚轮在 WPF 中水平滚动?

    如何使 WPF 能够响应使用鼠标滚轮的水平滚动 例如 我有一个 Microsoft Explorer 迷你鼠标 并尝试使用以下命令水平滚动 ScrollViewer 中包含的内容 HorizontalScrollBarVisibility
  • 使 jQuery 的 .prev().prev().prev().find("selector") 调用更容易

    我怎样才能避免 prev prev prev 打电话 这有捷径吗 您可以使用 prevAll 结合eq or eq since prevAll以相反顺序返回一组元素 从最接近当前元素的元素开始 0 相当于 prev prev prev 将会
  • ODBC 源的版本与此版本的数据流不兼容

    我有一个 SSIS 包 我使用批处理文件通过 DTEXec 运行它 它看起来像这样 cd C Program Files x86 SonicWALL SSL VPN NetExtender NECLI connect s test co u
  • 反序列化复杂对象中的 xml

    我不明白为什么对象为空 WebClient browse new WebClient StreamReader res new StreamReader browse OpenRead http ws audioscrobbler com
  • 将列值与 NA 进行比较

    下面的输入表的数据点是NA 我明白在R当一个值与NA它导致输出是NA 还有办法让我仍然可以使用进行比较ifelse 并确保所比较的值之一是否是NA那么它仍然会提供输出 就像NA是否正在比较字符 字符串 输入原始数据 data lt read
  • 不要在循环内创建函数[重复]

    这个问题在这里已经有答案了 在这种情况下解决 jslint 错误的正确方法是什么 我正在向使用它的对象添加一个 getter 函数 我不知道如何在不创建循环内的函数的情况下执行此操作 for var i 0 i
  • 类在 /Users/... 和 /Applications/... 中实现。使用两者之一。哪一个是未定义的

    我知道这是使用单元测试时的常见错误消息 但我没有这样做 这就是我所做的 我创建了一个新的命令行工具项目 我在print Hello World line 我输入类似的内容po 3 3进入控制台 然后我收到这条消息 objc 929 类 Tt
  • 如何在地图上以最少的重叠绘制网络

    我有一些作者所在的城市或国家 我想知道是否可以在地图上绘制合著者的网络 图 1 其中包含国家的坐标 请考虑来自同一国家 地区的多名作者 编辑 可以像示例中那样生成多个网络 并且不应显示可避免的重叠 这是为数十位作者准备的 缩放选项是可取的
  • \r 不生成换行符

    我使用以下代码 if delanaloge equals stari if novi equals zdruzen else zdruzen zdruzen novi r nap true r附加以创建换行符 但它不会像我预期的那样生成换行
  • VC++中如何判断链接是否存在?

    我有一个链接 我已通过正则表达式检查该链接是否是有效的 URL 现在 我想检查该链接是否是有效的 http 链接 即它不应该是不存在的链接 VC 6 0 MFC 有办法检查吗 一种选择是尝试使用以下方法从该 URL 获取数据URLOpenB
  • 关闭 Twisted conch SSH 连接的正确方法是什么?

    关闭 Twisted conch SSH 连接的正确方法是什么 有没有明确的方法来做到这一点 我见过的所有 Twisted conch 示例都会关闭 SSH 通道 然后停止反应器 反应堆关闭似乎可以处理关闭连接 但是 我将 wxreacto
  • 在Atom中使用anaconda环境

    我已经安装了 Anaconda Python 3 6 和 tensorflow python 3 5 我已经设法让它在 Spyder 和 sublime text 3 上运行 通过创建新的构建系统 现在所有的都是使用Atom 我不习惯 所以
  • 在heroku中记录多行消息

    我正在使用 NodeJS 开发一个应用程序并部署在 Heroku 中 我需要记录多行消息 例如堆栈跟踪和其他多行信息 但希望将它们保留为一条日志消息 问题是当使用console log 或任何使用的框架console log stdout
  • 如何从 AsyncTasks doInBackground() 检索数据?

    我会尽可能让这个简单 我的控制层中有一个使用类的方法CallServiceTask延伸AsyncTask 当调用新的CallServiceTask execute parameters 如何检索从返回的数据doInBackground 我发