Android开发:如何将AsyncTask返回值显示到TextView中
解决AsyncTask POST请求响应无法显示到TextView的问题
你的问题根源在于AsyncTask是异步执行的:当你调用execute()后,doInBackground()会在后台线程运行,而你立刻执行TW_Rueckgabe[0].setText(test.fetching_data)时,异步任务还没完成,fetching_data还未被onPostExecute()赋值,所以TextView无法显示响应内容。
方案一:直接在AsyncTask的onPostExecute中更新TextView
onPostExecute()方法是在主线程执行的,可以直接操作UI控件。我们可以把TextView传递给AsyncTask,在任务完成后直接更新:
修改POSTRequestTask类
class POSTRequestTask extends AsyncTask<String, Void, String> { private TextView mResultTextView; // 构造方法传入需要更新的TextView public POSTRequestTask(TextView resultTextView) { mResultTextView = resultTextView; } @Override protected String doInBackground(String... params) { // 原有的网络请求逻辑保持不变 String url = params[0]; String requestData = params[1]; String response = ""; try { URL obj = new URL(url); HttpURLConnection con = (HttpURLConnection) obj.openConnection(); con.setRequestMethod("POST"); con.setDoOutput(true); DataOutputStream wr = new DataOutputStream(con.getOutputStream()); wr.writeBytes(requestData); wr.flush(); wr.close(); int responseCode = con.getResponseCode(); System.out.println("\nSending 'POST' request to URL : " + url); System.out.println("Response Code : " + responseCode); BufferedReader in = new BufferedReader( new InputStreamReader(con.getInputStream())); String inputLine; StringBuffer responseBuffer = new StringBuffer(); while ((inputLine = in.readLine()) != null) { responseBuffer.append(inputLine); } in.close(); response = responseBuffer.toString(); } catch (IOException e) { e.printStackTrace(); } return response; } @Override protected void onPostExecute(String result) { System.out.println("\n\n\n" + result + "\n\n\n"); // 直接更新TextView if (mResultTextView != null) { mResultTextView.setText(result); } } }
修改MainActivity中的点击事件
final TextView TW_Rueckgabe = findViewById(R.id.textViewRueckgabe); Button sendBtn = findViewById(R.id.sendBtn); sendBtn.setOnClickListener(v -> { String POST_url = "http://dphost.ddns.net:1573/cool/post.php"; String requestData = "data=" + TW_Benutzername.getText().toString(); // 传入TextView实例执行异步任务 new POSTRequestTask(TW_Rueckgabe).execute(POST_url, requestData); });
方案二:使用接口回调解耦任务与UI
如果希望异步任务和UI逻辑分离,可以定义回调接口:
定义回调接口
interface OnPostResponseListener { void onResponseReceived(String response); }
修改POSTRequestTask类
class POSTRequestTask extends AsyncTask<String, Void, String> { private OnPostResponseListener mListener; public POSTRequestTask(OnPostResponseListener listener) { mListener = listener; } @Override protected String doInBackground(String... params) { // 原网络请求逻辑不变 String url = params[0]; String requestData = params[1]; String response = ""; try { URL obj = new URL(url); HttpURLConnection con = (HttpURLConnection) obj.openConnection(); con.setRequestMethod("POST"); con.setDoOutput(true); DataOutputStream wr = new DataOutputStream(con.getOutputStream()); wr.writeBytes(requestData); wr.flush(); wr.close(); int responseCode = con.getResponseCode(); System.out.println("\nSending 'POST' request to URL : " + url); System.out.println("Response Code : " + responseCode); BufferedReader in = new BufferedReader( new InputStreamReader(con.getInputStream())); String inputLine; StringBuffer responseBuffer = new StringBuffer(); while ((inputLine = in.readLine()) != null) { responseBuffer.append(inputLine); } in.close(); response = responseBuffer.toString(); } catch (IOException e) { e.printStackTrace(); } return response; } @Override protected void onPostExecute(String result) { System.out.println("\n\n\n" + result + "\n\n\n"); // 回调通知UI更新 if (mListener != null) { mListener.onResponseReceived(result); } } }
修改MainActivity中的点击事件
final TextView TW_Rueckgabe = findViewById(R.id.textViewRueckgabe); Button sendBtn = findViewById(R.id.sendBtn); sendBtn.setOnClickListener(v -> { String POST_url = "http://dphost.ddns.net:1573/cool/post.php"; String requestData = "data=" + TW_Benutzername.getText().toString(); new POSTRequestTask(new OnPostResponseListener() { @Override public void onResponseReceived(String response) { TW_Rueckgabe.setText(response); } }).execute(POST_url, requestData); });
额外说明:AsyncTask已被弃用,推荐使用现代异步方案
从Android 11开始,AsyncTask已被官方弃用,推荐使用以下方案实现网络请求:
- Kotlin协程(如果项目支持Kotlin)
- OkHttp配合Executor/Handler
- RxJava
这里给出OkHttp的实现示例(需先添加OkHttp依赖到build.gradle):
添加OkHttp依赖
implementation 'com.squareup.okhttp3:okhttp:4.12.0'
使用OkHttp实现POST请求
final TextView TW_Rueckgabe = findViewById(R.id.textViewRueckgabe); Button sendBtn = findViewById(R.id.sendBtn); sendBtn.setOnClickListener(v -> { String POST_url = "http://dphost.ddns.net:1573/cool/post.php"; String requestData = "data=" + TW_Benutzername.getText().toString(); OkHttpClient client = new OkHttpClient(); RequestBody body = RequestBody.create(requestData, MediaType.parse("application/x-www-form-urlencoded")); Request request = new Request.Builder() .url(POST_url) .post(body) .build(); client.newCall(request).enqueue(new Callback() { @Override public void onFailure(@NonNull Call call, @NonNull IOException e) { e.printStackTrace(); } @Override public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException { if (response.isSuccessful()) { final String responseData = response.body().string(); // 切换到主线程更新UI runOnUiThread(() -> { TW_Rueckgabe.setText(responseData); }); } } }); });
内容的提问来源于stack exchange,提问作者Justin
相关产品推荐
相关产品推荐

