【问题标题】:AsyncTask won't let me use my own classAsyncTask 不允许我使用自己的类
【发布时间】:2013-05-20 01:41:44
【问题描述】:

我有一个 AsyncTask 通过每次创建一个类的新实例来加载 ListView 中的条目,其中将保存变量并让它们从扩展为 BaseAdapter 的自己的适配器加载。

类如下所示:

public class PictureResults
{
    private long id;
    private String pictureURL;

    public void setId(long id)
    {
        this.id = id;
    }

    public long getId()
    {
        return id;
    }

    public void setPictureURL(String pictureURL)
    {
        this.pictureURL = pictureURL;
    }

    public String getPictureURL()
    {
        return pictureURL;
    }
}

这是我的 AsyncTask 类:

private class getPictureDataTask extends AsyncTask<Long, String, Void>
    {
        protected PictureResults doInBackground(Long... param)
        {
                PictureResults pr;

                pr = new PictureResults();
                pr.setId(param[0]);
                pr.setPictureURL("http://www.myurl.com");

                return pr;
        }

        protected void onProgressUpdate(String... response)
        {
            //do nothing
        }

        protected void onPostExecute(PictureResults ret)
        {
            picResults.add(ret); //picResults is an ArrayList<PictureResults>
            ret.loadPicture(customAdapter);
            customAdapter.notifyDataSetChanged();
        }
    }

出现的主要问题是 Eclipse 让我知道以下内容:

The return type is incompatible with AsyncTask<Long,String,Void>.doInBackground(Long[])

重要的是,尤其是 customAdapter.notifyDataSetChanged(); 将在 onPostExecute 中执行,因为在 onProgressUpdate 中,有时我的应用程序崩溃导致从后台线程更改 ListView。

为什么我不能使用 PictureResults 作为类型???

顺便说一句:这就是我执行 AsyncTask 的方式:

Long hey = (long) 1;
new getPictureDataTask().execute(hey);

【问题讨论】:

  • 扩展 AsyncTask 时,3 指的是 doInBackground 返回对象,因此应将其从 Void 更改为 PictureResults。

标签: android android-listview android-asynctask baseadapter


【解决方案1】:

AsyncTask的第三个类型参数应该是PictureResults而不是Void

class getPictureDataTask extends AsyncTask<Long, String, PictureResults>

因为AsyncTask的第三个参数类型是应该返回什么样的数据结果。如果您不想从doInBackground() 返回任何结果,请使用Void,然后使用return null;

【讨论】:

    【解决方案2】:

    你应该把它改成 AsyncTask

    【讨论】:

    • 你是指我班上的“这个”吗?以及如何改变它,我的课程可以正常工作?
    • 对不起,我没有粘贴这部分。我的意思是 voidwith AsyncTask 像这样
    【解决方案3】:

    当你想要返回 PictureResults 时,你应该在 AsyncTask 中声明。

    private class getPictureDataTask extends AsyncTask<Long, String, PictureResults>
    {
        ......
    }
    

    【讨论】:

      【解决方案4】:

      在实现 AsyncTask 时查看尖括号中的 3 个参数。

      AsyncTask<Params, Progress, Result>  
      

      参数由 doInBackground() 方法获取,当您使用 excute() 启动任务时传递它;
      结果应由 doInBackground() 方法返回,并将由 onPostExecute(Result ret) 方法获取。
      每个都应该是您在实现自定义任务类时定义的类型。
      更多信息是here

      【讨论】:

        【解决方案5】:

        您应该将 AsyncTask 更改为 AsyncTask

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-10-30
          • 2011-11-25
          • 1970-01-01
          • 2012-03-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多