AsyncTask:DoInBackground(String ...)与DoInBackground(Params ...)发生冲突?

6
尝试使用异步任务进行HTTP post时,会出现以下错误:
ASyncTask: DoInBackground(String...) clashes with DoInBackground(Params...) in Android.os.AsyncTask; attempting to use incompatible return type

我该如何修复此问题?这是我第一次使用AsyncTask。

导致错误的具体代码行:

@Override
        protected String doInBackground(String... params) {

完整AsyncTask的代码:

private class MyTask extends AsyncTask<String, Void, Void>
    {
        boolean success = false;

        @Override
        protected String doInBackground(String... params) {
            StringBuilder respData = new StringBuilder();
            URL url = new URL("MY_URL");
            URLConnection conn = url.openConnection();
            HttpURLConnection httpUrlConnection = (HttpURLConnection) conn;

            httpUrlConnection.setUseCaches(false);
            httpUrlConnection.setRequestProperty("User-Agent", "App");
            httpUrlConnection.setConnectTimeout(30000);
            httpUrlConnection.setReadTimeout(30000);

            httpUrlConnection.setRequestMethod("POST");
            httpUrlConnection.setDoOutput(true);

            OutputStream os = httpUrlConnection.getOutputStream();
            //InputStream postStream = toInputStream(toSubmit, "UTF-8");
            InputStream stream = new ByteArrayInputStream(toSubmit.getBytes(StandardCharsets.UTF_8));
            try {
                copy(stream, os);
            } finally {
                stream.close();
                os.flush();
                os.close();
            }

            httpUrlConnection.connect();

            int responseCode = httpUrlConnection.getResponseCode();

            if (200 == responseCode) {
                InputStream is = httpUrlConnection.getInputStream();
                InputStreamReader isr = null;
                try {
                    isr = new InputStreamReader(is);
                    char[] buffer = new char[1024];
                    int len;
                    while ((len = isr.read(buffer)) != -1) {
                        respData.append(buffer, 0, len);
                    }
                } finally {
                    if (isr != null)
                    {
                        isr.close();
                        success = true;
                    }
                }
                is.close();
            }
            else {
                // use below to get error stream
                // inputStream = httpUrlConnection.getErrorStream();
            }
            return "done";
        }

        @Override
        protected void onPostExecute(Void aVoid) {
            super.onPostExecute(aVoid);

            Toast toast = Toast.makeText(getApplicationContext(), "Success", Toast.LENGTH_SHORT);

        }
    }
2个回答

9

请按照以下方式声明您的类:

private class MyTask extends AsyncTask<String, Void, String>

最后一个参数是你将从doInBackground返回的类型,也是传递给onPostExecute的输入。


谢谢,问题已解决,但现在我遇到了postexecute的错误:onPostExecute(java.lang.string)无法应用于(java.lang.void)。 - java12340000
将您的onPostExecute更改为protected void onPostExecute(String result)。 - prashant

3

根据AsyncTask的文档:

异步任务由三个泛型类型 Params、Progress 和 Result 定义。

您的 doInBackground() 方法返回一个 String 值,但您的代码中 Result 参数是 Void。将 doInBackground()return 值从 String 更改为 Void 将解决这个问题 - 或者,您可以将 <String,Void,Void> 替换为 <String,Void,String>


谢谢,问题已解决,但我现在遇到了一个postexecute的错误: onPostExecute(java.lang.string)不能应用于(java.lang.void)? - java12340000
@java12340000 将 protected Void doInBackground(String... params) 替换为 protected String doInBackground(String... params),在 doInBackground() 中返回 null 而不是 "done",并将类声明保持为 private class MyTask extends AsyncTask<String, Void, Void> - 这似乎是您的最佳解决方案。 - PPartisan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接