【问题标题】:Can't Override onPostExecute() method in AsyncTask Class无法覆盖 AsyncTask 类中的 onPostExecute() 方法
【发布时间】:2015-05-08 19:16:13
【问题描述】:

我知道有几个问题与这个问题非常相似,但到目前为止它们并没有帮助我。我仍然无法覆盖此 AsyncTasks。 你能帮帮我吗?

我已经确保 doInBackground() 提供了 onPostExecute() 需要的某种类型(第一个示例中的布尔值和第二个示例中的 JSON)。

除了我将 AsyncTask 扩展为原始类型之外,您是否看到任何其他内容(不确定在此处输入什么)

这是 eclipse 告诉我每种方法的错误:

Register.NetCheck 类型的 onPostExecute(Boolean) 方法必须重写或实现超类型方法

对于类 eclipse 告诉我:

  • Register.NetCheck 类型必须实现继承的抽象方法 AsyncTask.doInBackground(Object...)

  • AsyncTask 是原始类型。对泛型类型 AsyncTask 的引用应该是 参数化

示例 1:

private class NetCheck extends AsyncTask {

        @Override
        protected void onPreExecute(){
            super.onPreExecute();
            do.something();
        }

        @Override
        protected Boolean doInBackground (String... args){
               if (do.something.worked){
                   return true; }
               else { return false}
        }

        @Override
        protected void onPostExecute(Boolean th){
            evalute.input.boolValue();
        }
    }

示例 2:

private class ProcessRegister extends AsyncTask {

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            show.some.dialog();
        }
        @Override
        protected JSONObject doInBackground(String... args) {
        JSONObject json = generate.some.json();
            return json;
        }
        @Override
        protected void onPostExecute(JSONObject json) {
           evaluate.something();
        }

}

【问题讨论】:

    标签: android android-asynctask return return-value


    【解决方案1】:

    您的异步任务不期望返回值,因此无法识别

    protected void onPostExecute(Boolean th)
    

    试试这个:

    private class NetCheck extends AsyncTask<String, Void, Boolean> {
    
        @Override
        protected void onPreExecute(){
            super.onPreExecute();
            do.something();
        }
    
        @Override
        protected Boolean doInBackground (String... args){
               if (do.something.worked){
                   return true; }
               else { return false}
        }
    
        @Override
        protected void onPostExecute(Boolean th){
            evalute.input.boolValue();
        }
    }
    

    在第二个示例中,将 Boolean 替换为 JSONObject。尽量始终使用 IDE 自动为您实现方法,这样可以避免此类问题。

    【讨论】:

    • 你能告诉我为什么使用doInBackground (Void... params)而不是我的doInBackground (String... args)版本。只是为了您的注意:我从其他地方复制了代码片段,并试图使其适合我的需求
    • 修改@Krummy
    【解决方案2】:

    您应该使用类型扩展 AsyncTask。请参见下面的示例。

    public class MyTask extends AsyncTask<Void, String, Integer> {
        @Override
        protected Integer doInBackground(Void... params) {
            return null;
        }
    
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }
    
        @Override
        protected void onPostExecute(Integer integer) {
            super.onPostExecute(integer);
        }
    
        @Override
        protected void onProgressUpdate(String... values) {
            super.onProgressUpdate(values);
        }
    
        @Override
        protected void onCancelled(Integer integer) {
            super.onCancelled(integer);
        }
    
        @Override
        protected void onCancelled() {
            super.onCancelled();
        }
    }
    

    用适当的类型替换 Void、String、Integer。更多信息是here。 关于日食。删除并安装Android Studio

    【讨论】:

    • 你能解释一下为什么shell我使用&lt;void, void, void&gt;而不是例如&lt;String, Object, Boolean&gt; 或喜欢另一个答案的人说&lt;Void, Void, Boolean&gt;
    • 第一个参数String表示你将在执行时将一个字符串作为参数传递给任务,第二个Object表示将在任务执行时发布的进度单元,第三个表示异步任务将产生的结果类型
    • 从几分钟前开始,我对这整件事有了更多的了解! :D 非常感谢您的快速回复!
    • 现在应该可以工作了:onPostExecute(JSONObject s)
    猜你喜欢
    • 2011-11-13
    • 1970-01-01
    • 2017-03-07
    • 1970-01-01
    • 1970-01-01
    • 2016-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多