【问题标题】:AsyncTask methods: I get error whether I write "@Override" annotation or notAsyncTask 方法:无论我是否编写“@Override”注释,都会出错
【发布时间】:2014-11-15 12:16:50
【问题描述】:

我正在编写一个用于使用基于 SOAP 的 Web 服务的 Android 客户端。我正在使用AsyncTask 来执行网络(即调用网络服务)操作。我正在编写客户端。

  1. 现在,当我尝试实现 AsyncTaskdoInBackground 方法时, 我在protected String doInBackground(String[] params)... 收到以下两个错误如果我写@Override 注释:

    MainActivity.MyTask 类型的方法 doInBackground(String[]) 必须覆盖或实现超类型方法。 1 快速修复:删除 '@Override' 注释

    private class MyTask extends AsyncTask... 出现以下错误:

    MainActivity.MyTask 类型必须实现继承的抽象方法 AsyncTask.doInBackground(String[]...)。 2 快速修复:添加未实现的方法(这会自动生成 doInBackground 再次使用@Override 方法 注释) 将类型“MyTask”抽象化。

  2. 如果我不写@Override 注释,我只会得到第二个错误。

    ...
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            String [] params = {URL, METHOD_NAME, NAMESPACE}; 
        }
    
        private class MyTask extends AsyncTask<String[], Void, String> {
    
            //@Override write it or not write it? :s ****************
            protected String doInBackground(String[] params) {
                // TODO Auto-generated method stub
                return null;
            }
        }
    ...
    

这背后的原因可能是什么?我该怎么办?

【问题讨论】:

  • private class MyTask extends AsyncTask&lt;String[], Void, String&gt;更改为private class MyTask extends AsyncTask&lt;String, Void, String&gt;并在doInBackground argments中写入String...而不是String[]

标签: java android android-asynctask annotations overriding


【解决方案1】:

你有语法错误:

改变

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

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

并在doInBackground 参数中写入String... 而不是String[]

protected String doInBackground(String... params) {
    // TODO Auto-generated method stub
    return null;
}

希望这会有所帮助。

【讨论】:

  • @BlazeTama 终于转换成String[]了..See here
  • 我明白了。非常感谢:)
【解决方案2】:

由于AsyncTask&lt;String[], Void, String&gt; 中的方法被声明为doInBackground(String[]... params) - 可能在替换了正确的类型参数之后,当您在MyTask 中覆盖它时,您需要具有相同的参数类型。看起来您写的是 doInBackground(String[] params) 而不是 doInBackground(String[]... params)

请注意,这意味着params 将是一个完整的字符串数组序列。那可能不是你想要的。你真的是想让MyTask 扩展AsyncTask&lt;String[], Void, String&gt; 吗?

【讨论】:

  • 哦,我的错,它应该是一个可变参数doInBackground(String... params),我相信因为作为超类型的AsyncTask 类本身必须在其doInBackground 中有一个可变参数参数。即使我传递一个字符串数组,在我的程序中也没关系,因为我相信可变参数的处理方式与我认为的数组一样。谢谢,这解决了我的问题。
  • 如果您想在此处传递String... params,那么您可能需要更改MyTask,以便它扩展AsyncTask&lt;String, Void, String&gt;,如MysticMagic 的回答中给出的那样。
【解决方案3】:

doInBackground 方法应该写成

doInBackground(Params... params)

【讨论】:

  • 当编译错误表明该类必须实现AsyncTask.doInBackground(String[]...)时,这有什么帮助?
  • Params 在这里是一个通用的占位符,并不是说他应该明确地写而不是 String[]... 我应该更清楚
猜你喜欢
  • 2012-02-02
  • 2020-04-13
  • 2015-08-07
  • 1970-01-01
  • 2010-11-03
  • 2021-01-07
  • 2011-09-09
  • 1970-01-01
  • 2013-07-20
相关资源
最近更新 更多