【问题标题】:Sending a signal from AsyncTask with result?从 AsyncTask 发送带有结果的信号?
【发布时间】:2015-12-02 10:42:30
【问题描述】:

在我的 android 应用程序中,我有一个 MainActivity,我通过单击一个按钮来触发另一个函数:

ImageButton button_1 = (ImageButton) findViewById(R.id.button_trigger);
button_1.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        webView = (WebView) findViewById(R.id.webViewLayout);

        MyClass myCls = new MyClass(getApplicationContext());
        myCls.getWebView(authWebView);
    }
});

在 MyClass 类中,我通过以下方式触发 AsyncTaks:

RespsonseGetterTask task = new RespsonseGetterTask();
task.execute(parameter);

然后在此处使用 postExecute 实现:

private class RespsonseGetterTask extends AsyncTask<String, Void, Boolean> {
    @Override
    protected Boolean doInBackground(String... args) {
        IdTokenResponse response;
        try {
            response = HttpUtils.request(args);
        } catch (IOException e) {
            return false;
        }
        return true;
    }

   @Override
   protected void onPostExecute(Boolean wasSuccess) {
       if (wasSuccess) {
           logger.debug("SUCCESSFULL");
           // take actions
       } else {
           logger.debug("Error");
           // take actions on error
       }
   }

我可以得到一个IdTokenResponse 对象,这样我的响应变量就有了有效的内容。所以那个响应对象在那个味道中,我的 MainActivity 没有注意到最近的结果。

如何向我的 MainActivity 发送有关响应 (IdTokenResponse) 对象的信号?

【问题讨论】:

  • 您可以通过两种方式做到这一点first 使用interfacesecond 您可以将myclass 设为innerclass,然后从myclass 覆盖方法
  • Check - 但我也认为使用 Async 任务而没有它的 post execute 对你有用是没有乐趣的。您应该选择服务。
  • 您可以将 ResponseGetterTask 作为主要活动的内部类。这样该响应就可以在其中使用
  • @Srinivasan 但是必须在 MyClass 中触发 RepsonsgetterTask。
  • 尝试在类和异步 postExecute() 中进行方法调用的返回类型

标签: android android-activity android-asynctask


【解决方案1】:

返回 idTokenResponse 而不是布尔值...

private class RespsonseGetterTask extends AsyncTask<String, Void, IdTokenResponse> {
    @Override
    protected IdTokenResponse doInBackground(String... args) {
        IdTokenResponse response = null;
        try {
            response = HttpUtils.request(args);
        } catch (IOException e) {
            response = null;
        }
        return response;
    }

...并根据结果使用 PostExecute 采取行动(在您的 UI 活动中):

    @Override
    protected void onPostExecute(IdTokenResponse response) {

        if(response != null){
            // Take action when your response is not null
        }
        else{
            // Take action when your response is null
        }

     }
}

【讨论】:

  • @Igallard 我在代码中添加了 onPostExecute,但即使我用你的返回值来做,MainActivity 怎么会被注意到?
  • 如果RespsonseGetterTask MainActivity 的本地,那么RespsonseGetterTask.onPostExecute 可以调用方法MainActivity.showToken(IdTokenResponse response)
  • 您必须在 postExecute 中更改或通知您的 UI Activity。正如 k3b 建议的那样,在 MainActivity 中有一个方法可以工作。例如,在 showToken 方法中,您可以获取您的 webview 并根据您得到的响应更新它。
【解决方案2】:
private class RespsonseGetterTask extends AsyncTask<String, Void, IdTokenResponse> {
    @Override
    protected IdTokenResponse doInBackground(String... args) {
        IdTokenResponse response = null;
        try {
            response = HttpUtils.request(args);
        } catch (IOException e) {
            response = null;
        }
        return response;
    }

使用上面和在按钮调用中使用下面:

RespsonseGetterTask task = new RespsonseGetterTask();
task.execute(parameter).get();
if(task!= null){
            // Take action when your response is not }else{
            // Take action when your response is null}

所以上面允许您将结果返回到单击按钮的类

【讨论】:

  • 1.在 MainAcitvity 中按下该按钮。 --> 2. 这会触发 MyClass.doSomething() --> 3. 这是我的 RespsonseGetterTask 任务。 ;; Myclass 不知道 MainActivity。
  • 当您单击主活动中的按钮时,它会调用运行后台任务的异步任务类并将结果返回到您需要使用第二个代码处理的主活动,如果您想在 ui 主线程上运行 bg 任务,然后在 doInBackground 函数中使用以下一个: if (android.os.Build.VERSION.SDK_INT > 9) { StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll( )。建造(); StrictMode.setThreadPolicy(policy); }
猜你喜欢
  • 2011-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-08
  • 1970-01-01
  • 2011-03-10
  • 2022-12-09
  • 2018-05-14
相关资源
最近更新 更多