【发布时间】: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