【问题标题】:Async task does not let me override onPostExecute (method does not override method from it's superclass)异步任务不允许我覆盖 onPostExecute (方法不会覆盖它的超类中的方法)
【发布时间】:2016-12-20 01:54:05
【问题描述】:

我正在创建一个可以抓取 YouTube 上播放列表列表的应用。它曾经是一个视频列表,但我已经更改了代码,现在它不允许我覆盖该方法。

我的理解是我应该用新的播放列表值而不是以前的视频来更改“扩展 AsyncTask”,但它仍然不起作用。

原来是这样的:

public abstract class GetPlaylistAsyncTask extends AsyncTask<String, Void, Pair<String, List<Video>>> {

现在是:

public abstract class GetPlaylistAsyncTask extends AsyncTask<String, Void, Pair<String, List<Playlist>>> {

这是错误所在:

mPlaylist = new Playlist(mPlaylistId);
initAdapter(mPlaylist);
new GetPlaylistAsyncTask(mYouTubeDataApi, mTitle, mSearchQuery) {
    @Override
    public void onPostExecute(Pair<String, List<Playlist>> result) {
        handleGetPlaylistResult(mPlaylist, result);
    }
}.execute(mPlaylist.playlistId, mPlaylist.getNextPageToken());

这是 AsyncTask:

public abstract class GetPlaylistAsyncTask extends AsyncTask<String, Void, Pair<String, List<Playlist>>> {
    private static final String TAG = "GetPlaylistAsyncTask";
    private static final Long YOUTUBE_PLAYLIST_MAX_RESULTS = 50L;

    private static final String YOUTUBE_VIDEOS_PART = "snippet,contentDetails,statistics"; // video resource properties that the response will include.
    private static final String YOUTUBE_VIDEOS_FIELDS = "items(id,snippet(title,description,thumbnails/high),contentDetails/duration,statistics)"; // selector specifying which fields to include in a partial response.

    private YouTube mYouTubeDataApi;
    private String mTitle;
    private String mSearchQuery;

    public GetPlaylistAsyncTask(YouTube api, String title, String searchQuery) {
        mYouTubeDataApi = api;
        mTitle = title;
        mSearchQuery = searchQuery;
    }

    @Override
    protected Pair<String, List<Playlist>> doInBackground(String... params) {

        SearchListResponse searchResponse;
        try {
            YouTube.Search.List search = mYouTubeDataApi.search().list("id,snippet");

            search.setKey(ApiKey.YOUTUBE_API_KEY);
            search.setQ(mTitle + " " + mSearchQuery);

            search.setType("video");
            search.setFields("items(id/kind,id/videoId,snippet/title,snippet/thumbnails/default/url)");
            search.setMaxResults(YOUTUBE_PLAYLIST_MAX_RESULTS);
            searchResponse = search.execute();
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }

        if (searchResponse == null) {
            Log.e(TAG, "Failed to get playlist");
            return null;
        }

        ArrayList videoIds = new ArrayList();

        for (SearchResult item : searchResponse.getItems()) {
            videoIds.add(item.getId().getVideoId());
        }
        VideoListResponse videoListResponse = null;
        try {
            videoListResponse = mYouTubeDataApi.videos()
                    .list(YOUTUBE_VIDEOS_PART)
                    .setFields(YOUTUBE_VIDEOS_FIELDS)
                    .setKey(ApiKey.YOUTUBE_API_KEY)
                    .setId(TextUtils.join(",", videoIds)).execute();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return new Pair(searchResponse.getNextPageToken(), videoListResponse.getItems());
    }
}

我不明白我的代码有什么问题,如果您能指出正确的方向,我将不胜感激。提前致谢!

【问题讨论】:

  • 你得到什么错误?
  • 方法不会覆盖其超类中的方法
  • public更改为protected

标签: android android-asynctask


【解决方案1】:

我想通了。正如这篇文章所说,“onPostExecute”采用 doInBackground 返回的对象:

stackoverflow post

感谢大家的回答,尤其是@Enzokie

【讨论】:

    【解决方案2】:

    只需将public 更改为protected,因为onPostExecute 在设计上不是公开的。

        @Override
        protected void onPostExecute(Pair<String, List<Playlist>> result) {
            handleGetPlaylistResult(mPlaylist, result);
        }
    

    【讨论】:

    • 感谢您的回复!更改并重建,错误仍然在@Override
    • 你有teamviewer吗?这样我就可以看代码了。只需在我的电子邮件中向我发送消息,我会尝试找出答案或在聊天室中访问我chat.stackoverflow.com/rooms/82392/regular-chat
    猜你喜欢
    • 1970-01-01
    • 2018-08-03
    • 1970-01-01
    • 2016-08-22
    • 2016-12-08
    相关资源
    最近更新 更多