[英]Assigning string value to activity string variable from AsyncTask's onPostExecute method not working
我創建了一個看起來運行良好的REST API(我使用Postman測試了感興趣的GET請求)。
我正在使用AsyncTask從Android應用程序發出相同的請求。 希望將由AsyncTask生成的字符串值分配給Android活動中的字符串變量。
我已經使用Toast來查看doInBackground方法的字符串輸出,該方法將傳遞給AsyncTask的onPostExecute方法,以確保對API的調用正常進行並且工作正常。
當我將AsyncTask的字符串輸出分配給Activity類中定義的字符串變量時,就會出現問題。 執行AsyncTask之后,我使用Toast查看字符串變量的值,它反映了在onPostExecute方法中執行的賦值。
現在,我將分享我正在使用的代碼,以希望您能幫助我找到可能要出問題的地方。 單擊按鈕后,我打算執行驗證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;
}
user3691697對此問題的回答: 因為AsyncTask是一個單獨的類,如何將OnPostExecute()的結果獲取到主要活動中? 做到了。 我在執行任務時創建了任務對象(myTask),然后使用它將結果分配給變量,如下所示:
AsyncTask myTask = new JoinActivity.validate.execute(email_et.getText()。toString());
emailValid = myTask.get()。toString();
Toast消息確認作業已成功! 感謝您對Pulak和LeoNeo的幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.