【问题标题】:Assigning string value to activity string variable from AsyncTask's onPostExecute method not working从 AsyncTask 的 onPostExecute 方法将字符串值分配给活动字符串变量不起作用
【发布时间】:2018-01-13 11:45:49
【问题描述】:

我创建了一个看起来运行良好的 REST API(我使用 Postman 测试了感兴趣的 GET 请求)。

我正在使用 AsyncTask 从 Android 应用程序发出相同的请求。希望是把AsyncTask生成的字符串值赋给Android活动中的字符串变量。

我使用 Toast 查看了 doInBackground 方法的字符串输出,该输出被传递给 AsyncTask 的 onPostExecute 方法,以确保对 API 的调用正常工作。

当我将 AsyncTask 的字符串输出分配给 Activity 类中定义的字符串变量时,问题就来了。执行 AsyncTask 后,我使用 Toast 查看字符串变量的值,它反映了在 onPostExecute 方法中执行的分配。

我现在将分享我正在使用的代码,希望您能帮助我找出我可能出错的地方。单击按钮后,我打算执行 validate AsyncTask 并将值分配给 emailValid。

鉴于下面的代码,我可以用最直接的方式提出我的问题:“为什么 Toast 2 显示而 Toast 1 不显示?”

提前感谢您的帮助。

public class JoinActivity extends AppCompatActivity implements View.OnClickListener
{
    EditText email_et;
    Button join_b;

    String emailValid;

    @Override
    protected void onCreate(Bundle savedInstance)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_join);
        emailValid = "No";
        join_b = (Button) findViewById(R.id.aj_join_b);
        join_b.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) 
    {
        email_et = (EditText) findViewById(R.id.et_aj_email_address);
        new JoinActivity.validate().execute(email_et.getText().toString());
        // Toast 1 here:
        Toast.makeText(getApplicationContext(), emailValid, 
            Toast.LENGTH_LONG).show();
    }

    private class validate extends AsyncTask<String, Void, String> 
    {
        @Override
        protected String doInBackground(String... params) 
        {
            // ... GET request produces string with either yes or no i.e. outcome
            return outcome;
        }
        @Override
        protected void onPostExecute (String s) 
        {
            // Toast 2 here:
            Toast.makeText(getApplicationContext(), s, Toast.LENGTH_LONG).show();
            emailValid = s;
            super.onPostExecute(s);
        }
    }
}

根据要求,将 doInBackground 方法中的详细信息粘贴在下面。该方法实际上返回一些 XML。我最初的问题是“一个字符串变量,它是“是”或“否””是我试图简化设置的尝试。正如我之前提到的,在 onPostExecute 中的 Toast 中显示字符串可以很好地显示从 doInBackground 发送的参与者XML:

@Override
protected String doInBackground(String... params) {
    InputStream inputStream;
    String emailAddress = params[0];
    String outcome = null;
    HttpURLConnection httpURLConnection = null;
    BufferedReader bufferedReader = null;
    try
    {
        URL url = new URL("http://10.0.2.2:8080/project_name/webresources/entity.participant/email");
        httpURLConnection = (HttpURLConnection) url.openConnection();
        httpURLConnection.setRequestMethod("GET");
        httpURLConnection.setRequestProperty("Accept", "application/xml");
        httpURLConnection.addRequestProperty("Email-address", emailAddress);
        httpURLConnection.connect();
        inputStream = httpURLConnection.getInputStream();
        StringBuffer stringBuffer = new StringBuffer();
        if (inputStream == null) {
            return null;
        }
        bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
        String line;
        while ((line = bufferedReader.readLine()) != null) {
            stringBuffer.append(line + "\n");
        }
        if (stringBuffer.length() == 0) {
            return participantXML;
        }
        participantXML = stringBuffer.toString();
    } catch (ProtocolException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (httpURLConnection != null) {
            httpURLConnection.disconnect();
        }
        if (bufferedReader != null) {
            try {
                bufferedReader.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    validEmailAddress = participantXML;
    return participantXML;
}

【问题讨论】:

  • 您在此处提供的代码似乎存在一些问题。上述代码中的validate 类与您通过编写new JohnActivity.validate... 调用的类不同。如果确实 validate 类是被调用的类,请将其放入 JohnActivity
  • 您是否尝试在 onPostExecute 方法中放置一个调试器并查看它是否被调用?您是否在 doInBackgroud() 中得到有效响应?
  • @Pulak:复制和粘贴的危险。我已经编辑了代码以反映只有一个活动而不是两个是 JoinActivity。
  • @LeoNeo:不,我没有尝试过你的建议。到目前为止,我一直在使用 Toast 消息作为查看哪里出现问题的方法。我承认我从未使用过调试器,并将阅读如何使用它。您是否觉得即使放置在 onPostExecute 内的 Toast 消息显示字符串 s,该方法仍可能不会被调用?老实说,这让我很困惑。
  • 不,我怀疑您可能会在 doInBackground 中遇到异常,导致 onPostExecute 永远不会被调用。您可以在 doInBackground() 中发布代码吗?您在 Postman 中看到的电话响应到底是什么?

标签: java android string android-asynctask


【解决方案1】:

user3691697 对此问题的回答:How to get the result of OnPostExecute() to main activity because AsyncTask is a separate class? 成功了。我在执行任务时创建了任务对象(myTask),然后使用它将结果分配给变量,如下所示:

AsyncTask myTask = new JoinActivity.validate.execute(email_et.getText().toString());

emailValid = myTask.get().toString();

Toast 消息确认分配成功!感谢 Pulak 和 LeoNeo 的帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-13
    • 2022-06-15
    • 2013-02-23
    • 1970-01-01
    • 1970-01-01
    • 2019-02-08
    • 2015-02-04
    相关资源
    最近更新 更多