You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 04:55:17