簡體   English   中英

從AsyncTask的onPostExecute方法向活動字符串變量分配字符串值不起作用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM