无法解析 Android 中的方法“execute()”

Posted

技术标签:

【中文标题】无法解析 Android 中的方法“execute()”【英文标题】:Cannot resolve method 'execute()' in Android 【发布时间】: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);
    

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

【问题讨论】:

【参考方案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_
                android:layout_
                android:max="100"
                android:progress="75"
                android:progressDrawable="@drawable/circular_progress" />

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

【讨论】:

我也在做同样的事情。

以上是关于无法解析 Android 中的方法“execute()”的主要内容,如果未能解决你的问题,请参考以下文章

无法解析 Android 应用程序中的掷骰子游戏方法

尝试访问导入库中的方法时,Android Studio 显示“无法解析符号”

无法解析抖动事件侦听器中的 getApplicationContext 和 startActivity 方法:Android Studio

Android Location Client 无法解析方法

SpringJDBC解析2-execute方法

SpringJDBC解析3-回调函数(update为例)