无法解析 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 Studio 显示“无法解析符号”
无法解析抖动事件侦听器中的 getApplicationContext 和 startActivity 方法:Android Studio