Android:运行 4 个异步任务(与 Rest API 一起工作),等待并在完成所有任务后启动另一个 activity
Android: Run 4 async tasks (which works with Rest API), wait and start another activity after complete all tasks
我在处理异步任务时遇到了一些问题。我正在尝试 运行 4 个从 last.fm rest api.
获取数据的异步任务
我的任务点数:
- 运行 4 个任务(计数无关紧要,但必须大于 1)异步或并行
- Fetch data from last.fm rest api(为了从 last.fm api 获取数据,我使用了 de.umass.lastfm java 库)
- 等待完成所有任务
- 使用获取的数据启动另一个 activity
调用异步任务的函数:
<pre>override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_animation)
initViewElements();
mArtistName = intent.getStringExtra("ARTIST_NAME");
Log.i(TAG, mArtistName);
setAnimationData();
getArtistData(mArtistName);
startActivity(Intent(this, DetailsActivity::class.java))
}</pre>
介绍我任务的函数
<pre>
private fun getArtistData(name: String) {
val getArtistDataAsync = object : AsyncTask<String, Void, Artist>() {
override fun doInBackground(vararg args: String?): Artist? {
return Artist.getInfo(args[0], "26cc2ebf6da38bc646733f661bfc6268");
}
override fun onPostExecute(result: Artist?) {
super.onPostExecute(result)
CommonUtilities.artistInstance = result as Artist;
}
}
val getTopTracksAsync = object : AsyncTask<String,Void,ArrayList<Track>>(){
override fun doInBackground(vararg args: String?): ArrayList<Track>? {
return Artist.getTopTracks(args[0], "26cc2ebf6da38bc646733f661bfc6268") as ArrayList<Track>;
}
override fun onPostExecute(result: ArrayList<Track>?) {
super.onPostExecute(result)
CommonUtilities.trackListInstance = result;
}
}
val getSimilarBandsAsync = object : AsyncTask<String,Void,ArrayList<Artist>>(){
override fun doInBackground(vararg args: String?): ArrayList<Artist>? {
return Artist.getSimilar(args[0], "26cc2ebf6da38bc646733f661bfc6268") as ArrayList<Artist>?
}
override fun onPostExecute(result: ArrayList<Artist>?) {
super.onPostExecute(result)
CommonUtilities.artistListInstance = result; //Instance Messenger Pattern
}
}
val getTopAlbumsAsync = object : AsyncTask<String,Void, ArrayList<Album>>(){
override fun doInBackground(vararg p0: String?): ArrayList<Album>? {
return Artist.getTopAlbums(p0[0],"26cc2ebf6da38bc646733f661bfc6268") as ArrayList<Album>?;
}
override fun onPostExecute(result: ArrayList<Album>?) {
super.onPostExecute(result)
CommonUtilities.albumListInstance = result; //Instance Messenger Pattern
}
}
getArtistDataAsync.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, name)
getSimilarBandsAsync.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, name)
getTopTracksAsync.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, name)
getTopAlbumsAsync.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, name)
}
</pre>
堆栈跟踪:
<pre>
E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #4
Process: pw.osin.musicexpert, PID: 17334
java.lang.RuntimeException: An error occured while executing doInBackground()
at android.os.AsyncTask.done(AsyncTask.java)
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
at java.util.concurrent.FutureTask.run(FutureTask.java:242)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:841)
Caused by: de.umass.lastfm.CallException: Caching/Reloading failed
at de.umass.lastfm.Caller.call(Caller.java:246)
at de.umass.lastfm.Caller.call(Caller.java:189)
at de.umass.lastfm.Caller.call(Caller.java:185)
at de.umass.lastfm.Artist.getSimilar(Artist.java:144)
at de.umass.lastfm.Artist.getSimilar(Artist.java:132)
at pw.osin.musicexpert.activities.AnimationActivity$getArtistData$getSimilarBandsAsync.doInBackground(AnimationActivity.kt:120)
at pw.osin.musicexpert.activities.AnimationActivity$getArtistData$getSimilarBandsAsync.doInBackground(AnimationActivity.kt:117)
at android.os.AsyncTask.call(AsyncTask.java)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:841)
02-17 05:49:05.636 17334-17432/pw.osin.musicexpert W/dalvikvm: threadid=13: thread exiting with uncaught exception (group=0x4179ed58)
</pre>
- 那么我该如何解决这个错误呢?
- 如何等待任务完成?
- 哪里需要调用startActivity方法?
我使用的是 Kotlin,但任务方法 java 相似。如果你能告诉我如何使用 java 编写代码,那也很棒。
谢谢
需要将此行粘贴到所有使用 last.fm 库方法的异步任务
Caller.getInstance().cache = null
我在处理异步任务时遇到了一些问题。我正在尝试 运行 4 个从 last.fm rest api.
获取数据的异步任务我的任务点数:
- 运行 4 个任务(计数无关紧要,但必须大于 1)异步或并行
- Fetch data from last.fm rest api(为了从 last.fm api 获取数据,我使用了 de.umass.lastfm java 库)
- 等待完成所有任务
- 使用获取的数据启动另一个 activity
调用异步任务的函数:
<pre>override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_animation)
initViewElements();
mArtistName = intent.getStringExtra("ARTIST_NAME");
Log.i(TAG, mArtistName);
setAnimationData();
getArtistData(mArtistName);
startActivity(Intent(this, DetailsActivity::class.java))
}</pre>
介绍我任务的函数
<pre>
private fun getArtistData(name: String) {
val getArtistDataAsync = object : AsyncTask<String, Void, Artist>() {
override fun doInBackground(vararg args: String?): Artist? {
return Artist.getInfo(args[0], "26cc2ebf6da38bc646733f661bfc6268");
}
override fun onPostExecute(result: Artist?) {
super.onPostExecute(result)
CommonUtilities.artistInstance = result as Artist;
}
}
val getTopTracksAsync = object : AsyncTask<String,Void,ArrayList<Track>>(){
override fun doInBackground(vararg args: String?): ArrayList<Track>? {
return Artist.getTopTracks(args[0], "26cc2ebf6da38bc646733f661bfc6268") as ArrayList<Track>;
}
override fun onPostExecute(result: ArrayList<Track>?) {
super.onPostExecute(result)
CommonUtilities.trackListInstance = result;
}
}
val getSimilarBandsAsync = object : AsyncTask<String,Void,ArrayList<Artist>>(){
override fun doInBackground(vararg args: String?): ArrayList<Artist>? {
return Artist.getSimilar(args[0], "26cc2ebf6da38bc646733f661bfc6268") as ArrayList<Artist>?
}
override fun onPostExecute(result: ArrayList<Artist>?) {
super.onPostExecute(result)
CommonUtilities.artistListInstance = result; //Instance Messenger Pattern
}
}
val getTopAlbumsAsync = object : AsyncTask<String,Void, ArrayList<Album>>(){
override fun doInBackground(vararg p0: String?): ArrayList<Album>? {
return Artist.getTopAlbums(p0[0],"26cc2ebf6da38bc646733f661bfc6268") as ArrayList<Album>?;
}
override fun onPostExecute(result: ArrayList<Album>?) {
super.onPostExecute(result)
CommonUtilities.albumListInstance = result; //Instance Messenger Pattern
}
}
getArtistDataAsync.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, name)
getSimilarBandsAsync.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, name)
getTopTracksAsync.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, name)
getTopAlbumsAsync.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, name)
}
</pre>
堆栈跟踪:
<pre>
E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #4
Process: pw.osin.musicexpert, PID: 17334
java.lang.RuntimeException: An error occured while executing doInBackground()
at android.os.AsyncTask.done(AsyncTask.java)
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
at java.util.concurrent.FutureTask.run(FutureTask.java:242)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:841)
Caused by: de.umass.lastfm.CallException: Caching/Reloading failed
at de.umass.lastfm.Caller.call(Caller.java:246)
at de.umass.lastfm.Caller.call(Caller.java:189)
at de.umass.lastfm.Caller.call(Caller.java:185)
at de.umass.lastfm.Artist.getSimilar(Artist.java:144)
at de.umass.lastfm.Artist.getSimilar(Artist.java:132)
at pw.osin.musicexpert.activities.AnimationActivity$getArtistData$getSimilarBandsAsync.doInBackground(AnimationActivity.kt:120)
at pw.osin.musicexpert.activities.AnimationActivity$getArtistData$getSimilarBandsAsync.doInBackground(AnimationActivity.kt:117)
at android.os.AsyncTask.call(AsyncTask.java)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:841)
02-17 05:49:05.636 17334-17432/pw.osin.musicexpert W/dalvikvm: threadid=13: thread exiting with uncaught exception (group=0x4179ed58)
</pre>
- 那么我该如何解决这个错误呢?
- 如何等待任务完成?
- 哪里需要调用startActivity方法?
我使用的是 Kotlin,但任务方法 java 相似。如果你能告诉我如何使用 java 编写代码,那也很棒。
谢谢
需要将此行粘贴到所有使用 last.fm 库方法的异步任务
Caller.getInstance().cache = null