【问题标题】:Cannot resolve method 'execute()' in Android无法解析 Android 中的方法“execute()”
【发布时间】:2018-06-04 19:12:43
【问题描述】:

我正在尝试在我的fragment 之一中实现Circular ProgressBar

我想使用AsyncTask 类和其他后台进程来实现这一点,我希望progress bar 也能更新onProgressUpdate() 方法。

这是我实现 ProgressBar 的 Fragment:

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {


    // Inflate the layout for this fragment
    rootView = inflater.inflate(R.layout.playlist_fragment, container, false);

    // Setting up progressBar
    progressBar = (ProgressBar) rootView.findViewById(R.id.progressBar);
    progressBar.setProgress(0);

    return rootView;
}

从 Fragment 中调用 AsyncTask 类,该类表示无法解析 setProgressBr() 的方法。我认为我没有适当地传递参数。

new GetPlaylistAsyncTask(mYouTubeDataApi,getContext(),PlaylistFragment.this)
                .setProgressBar(progressBar)
                .execute(playlistVideos.playlistId, playlistVideos.getNextPageToken());

这是我的 AsyncTask 类:

    public class GetPlaylistAsyncTask extends AsyncTask<String, Integer, Pair<String, List<Video>>> {
    private static final String TAG = "GetPlaylistAsyncTask";
    private static final Long YOUTUBE_PLAYLIST_MAX_RESULTS = 10L;

    //see: https://developers.google.com/youtube/v3/docs/playlistItems/list
    private static final String YOUTUBE_PLAYLIST_PART = "snippet";
    private static final String YOUTUBE_PLAYLIST_FIELDS = "pageInfo,nextPageToken,items(id,snippet(resourceId/videoId))";
    //see: https://developers.google.com/youtube/v3/docs/videos/list
    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;
    Context mContext;
    ProgressBar bar;

    private AsyncResponse theListener;

    public void setProgressBar(ProgressBar bar) {
        this.bar = bar;
    }

    public GetPlaylistAsyncTask(YouTube api, Context context, PlaylistFragment frag ) {
        mYouTubeDataApi = api;
        mContext = context;
        theListener = (AsyncResponse)frag;
    }


    @Override
    protected Pair<String, List<Video>> doInBackground(String... params) {
        final String playlistId = params[0];
        final String nextPageToken;

        if (params.length == 2) {
            nextPageToken = params[1];
        } else {
            nextPageToken = null;
        }

        PlaylistItemListResponse playlistItemListResponse;
        try {
            playlistItemListResponse = mYouTubeDataApi.playlistItems()
                    .list(YOUTUBE_PLAYLIST_PART)
                    .setPlaylistId(playlistId)
                    .setPageToken(nextPageToken)
                    .setFields(YOUTUBE_PLAYLIST_FIELDS)
                    .setMaxResults(YOUTUBE_PLAYLIST_MAX_RESULTS)
                    .setKey(ApiKey.YOUTUBE_API_KEY)
                    .execute();
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }

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

        List<String> videoIds = new ArrayList();

        // pull out the video id's from the playlist page
        for (PlaylistItem item : playlistItemListResponse.getItems()) {
            videoIds.add(item.getSnippet().getResourceId().getVideoId());
        }

        // get details of the videos on this playlist page
        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(playlistItemListResponse.getNextPageToken(), videoListResponse.getItems());
    }

    @Override
    protected void onPreExecute() {

    }

    @Override
    protected void onProgressUpdate(Integer... values) {
        if (this.bar != null) {
            bar.setProgress(values[0]);
        }
    }

    @Override
    protected void onPostExecute(Pair<String, List<Video>> result) {
        theListener.handleGetPlaylistResult(null,result);
    }
}

希望能快速解决上述问题。提前致谢。

【问题讨论】:

    标签: android android-fragments android-asynctask android-progressbar


    【解决方案1】:

    .setProgressBar(progressBar) 方法的返回类型为 void,因此您不能像这样链接调用

    new GetPlaylistAsyncTask(mYouTubeDataApi,getContext(),PlaylistFragment.this)
                    .setProgressBar(progressBar)
                    .execute(playlistVideos.playlistId, playlistVideos.getNextPageToken());
    

    将您的 setProgressBar() 方法更改为以下内容,它应该可以工作

    public GetPlaylistAsyncTask setProgressBar(ProgressBar bar) {
            this.bar = bar;
            return this;
    }
    

    如果您不想更改方法签名,请执行以下操作

    final GetPlaylistAsyncTask getPlaylistAsyncTask = new GetPlaylistAsyncTask(mYouTubeDataApi,getContext(),PlaylistFragment.this);
    getPlaylistAsyncTask.setProgressBar(progressBar);
    getPlaylistAsyncTask.execute(playlistVideos.playlistId, playlistVideos.getNextPageToken());
    

    还要确保两个参数 playlistVideos.playlistId, playlistVideos.getNextPageToken() 都是字符串。

    【讨论】:

    • 如果它对您有用,请您将其标记为答案:)
    • 它工作正常,但它没有更新 progressBar onProgressUpdate 的值 ...
    • @LeoNeo 你能解释一下为什么没有调用 onProgressUpdate 方法吗?
    • 哦..我不会在任何地方调用 publishProgress !
    • 嗯,感谢您的时间和考虑。欣赏它。
    【解决方案2】:

    你可以这样做

    GetPlaylistAsyncTask playAsync=new (mYouTubeDataApi,getContext(),PlaylistFragment.this);
    playAsync.setProgressBar(progressBar);
    playAsync.execute(playlistVideos.playlistId, playlistVideos.getNextPageToken());
    

    希望这对你有用。

    【讨论】:

      【解决方案3】:

      您正在调用链中的方法。这样,每个方法都应该返回调用它的当前实例。如下修改你的方法就行了。

      public GetPlaylistAsyncTask setProgressBar(ProgressBar bar) {
      this.bar = bar;
      return this;
      }
      

      【讨论】:

      • 是的,它工作正常,但在 onProgressUpdate 上没有得到更新。对此的任何修复。
      【解决方案4】:

      您不能直接将进度添加到圆形进度条,这是我为解决此问题所做的。

      添加一个可绘制的文件circular_progress.xml

      <?xml version="1.0" encoding="utf-8"?>
      

      <item android:id="@android:id/secondaryProgress">
          <shape
              android:innerRadius ="15dp"
              android:shape="ring"
              android:useLevel="true"
              android:thickness="4dp" >
              <gradient
                  android:endColor="@color/blackBackground"
                  android:startColor="@color/blackBackground"
                  android:type="sweep" />
          </shape>
      </item>
      <item android:id="@android:id/progress">
          <rotate
              android:fromDegrees="270"
              android:pivotX="50%"
              android:pivotY="50%"
              android:toDegrees="270" >
              <shape
                  android:innerRadius ="15dp"
                  android:shape="ring"
                  android:useLevel="true"
                  android:thickness="4dp">
                  <rotate
                      android:fromDegrees="0"
                      android:pivotX="50%"
                      android:pivotY="50%"
                      android:toDegrees="360" />
      
                  <gradient
                      android:endColor="#e1c25b"
                      android:startColor="#e1c25b"
                      android:type="sweep" />
              </shape>
          </rotate>
      </item>
      

      在你的片段布局中添加一个进度条

       <ProgressBar
                      android:id="@+id/pb_download"
                      style="@style/Base.Widget.AppCompat.ProgressBar.Horizontal"
                      android:layout_width="match_parent"
                      android:layout_height="match_parent"
                      android:max="100"
                      android:progress="75"
                      android:progressDrawable="@drawable/circular_progress" />
      

      现在您可以使用 setProgress() 来更新进度。 随时提出任何疑问。

      【讨论】:

      • 我也在做同样的事情。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-26
      相关资源
      最近更新 更多