如何从 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() 检索数据? 的相关文章

  • 如何在Android中为很长的列表视图上方设置浮动操作按钮的固定位置?

    我正在开发一个 Android 应用程序 主要用于listview 但我在使用时遇到问题Floating Action Button和 一起Long ListView 我的问题如下 当列表视图只有几个项目时 Floating item看得到
  • 如何在Android中添加水平滚动视图和列表视图

    我正在尝试创建一个应用程序 因为我需要创建一个列表视图 但最重要的是我想要一个用于多个数据的水平列表视图 我很困惑我们该如何做到这一点 请帮助我 主要活动 XML
  • Android 的 MediaPlayer setSurface 在暂停状态下

    EDIT 显然这与多个活动无关 这与视频文件的编码有关 我会尝试简化问题 当我调用时 我有一个处于暂停状态的 MediaPlayer 对象mediaPlayer getCurrentPosition 我得到的结果是准确的 当我打电话时med
  • 如何在 Android 中编辑 asset 文件夹中的文本文件?

    我正在使用 Android 中资产文件夹中的文本文件 我想动态更改该文本文件内的数据 我试图按如下方式打开该文件 FileOutputStream fos this getAssets openNonAssetFd data txt cre
  • Android 版 YouTube 频道订阅

    我在我的应用程序中使用 YouTube API 用户可以使用其 Google 帐户登录 我希望用户能够订阅某些 YouTube 频道 这里似乎有一些关于网络的东西 https developers google com youtube su
  • Paypal 支付页面布局在 webview android 中损坏

    我在某些 Android 设备上遇到一个奇怪的问题 我正在 webview 上打开 PayPal 支付页面 但它的布局在某些设备上被破坏 请任何人有任何想法 请提出建议 我被困住了 该截图设备的浏览器为chrome版本34 0 1847 1
  • EditText 的可绘制右侧

    下面是我的布局
  • Android 设备上的 Facebook 分享问题

    我使用了来自的样本AndroidFacebook示例 https github com ddewaele AndroidFacebookSample它在模拟器上运行良好 但在设备上它被转移到内置的 Facebook 意图 设备上不会出现身份
  • android-透明RelativeLayout

    我想要制作一个具有可绘制渐变作为背景的活动 并将在其背景顶部显示 4 个面板 相对布局 现在我想让 4 个面板透明 例如 50 以便也可以看到渐变背景 我搜索了谷歌 但我发现只能通过活动而不是布局来做到这一点 如何做我想做的事 您可以创建一
  • ScrollView 中的 ViewPager 不会垂直滚动

    我有一个layout有一个ViewPager自定义内部ScrollView并且 ViewPager 不会垂直滚动 自定义 ScrollView 用于修复使用 ScrollView 进行可怕的选项卡滑动的问题 是的 有足够的内容可以滚动 我已
  • 如何使用抽屉布局左侧移动主要内容

    刚刚检查了如何使用 DrawerLayout 制作菜单here http www androidhive info 2013 11 android sliding menu using navigation drawer 但左侧菜单正在移动
  • Android NDK 模块依赖于另一个模块

    我有一个使用 Android NDK 编写的 Android 项目 在该项目中 我使用两个预构建的共享库 GpkgSDK 和 Spatialite 并构建另外两个共享库 WFSHelpers 和 com example gpkgviewer
  • listItems之间的黑线,如何删除?

    我的列表项之间有一些水平黑线 如何删除它们 我的图形没有一部分 谢谢 listview setDivider null listview setDividerHeight 0 或在 XML 中
  • 还有其他地方可以获得 google-services.json 吗?

    我尝试单击GET A CONFIGURATION FILE链接自the docs https developers google com identity sign in android start integrating get conf
  • android listactivity onCheckedChangeListener

    我正在开发一款应用程序 并且我有一个ListActivity 其选择模式设置为choice mode multiple 现在我想重写方法 当一项被调用时调用该方法选中 未选中 我发现onCheckChanged 方法仅针对RadioGrou
  • Firebase:获取对第一个项目/元素的引用

    我正在尝试获取对 firebase Array 中第一个项目的引用 就我而言 它会是 ElmmycgjS1Nvq albums IrdMMds 但我不确定如何构造查询 dbRef child ElmmycgjS albums child n
  • 电子邮件发不出去,短信中的链接为 404

    我们刚刚完成将 Google AppInvites 集成到我们的应用程序中 我们注意到以下问题 电子邮件不会被发送 而发送的短信会带有一个链接 显示会出现 404 页面 仅当我设置 设置其他平台目标应用程序 对于 Android 和 iOS
  • 如何等待 Kotlin 协程完成

    我读过几十篇文章 但不知何故 没有一个答案似乎适用于我的情况 我想要实现的是在Fragment中等待ViewModel使用Room执行操作 Dao Query SELECT FROM my table WHERE id id suspend
  • 是否可以从 Android Studio 恢复被覆盖的文件?

    由于错误 我覆盖了我的两个来自 android studio 的具有相同名称的项目 并且今天我已经取消了该操作 我尝试打开主项目 但发现其中没有 Java 类 只有布局文件 在我覆盖的第二个项目中 文件存在巨大混乱 并尝试使用 Androi
  • 如何获取 EC2 实例的 CloudWatch 指标数据

    我想获取我的 EC2 实例的 Cloudmetrics 数据 以便我可以使用这些数据绘制图表并将其显示在我的 Android 设备上 我怎么做 有相同的示例程序或教程吗 提前致谢 这就是我正在做的 private static void f

随机推荐

  • 如何使 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 我发