gpt4 book ai didi

java - 是否可以在另一个方法 "AsyncTask"中运行 "AsyncTask"方法?

转载 作者:行者123 更新时间:2023-12-01 17:16:05 27 4
gpt4 key购买 nike

我有一个 Activity ,在启动时调用“json”来获取歌曲的数据类别,之后我调用方法“AsyncTask”来获取来自另一个“JSON”的歌曲列表问题是,当我启动 Activity 时,它被锁定,2秒后, Activity 打开布局,我可以看到操作栏上的类别,而不是因为歌曲正在后台查找。

主要 Activity (onCreate):

    java.io.InputStream source = null;
source = retrieveStream(UrlApi.URL_BASE + UrlApi.URL_STORE + _bundle.getString("_id") + UrlApi.CATEGORY_SONG);
Log.i("URL - KARAOKE", UrlApi.URL_BASE + UrlApi.URL_STORE + _bundle.getString("_id") + UrlApi.CATEGORY_SONG);
Reader reader = new InputStreamReader(source);
Type happyCollection = new TypeToken<Collection<String>>() {}.getType();
_karaoke_category_response = new Gson().fromJson(reader, happyCollection);
if(_karaoke_category_response.size() < 1){
finish();
Toast.makeText(getApplicationContext(), "Local sin karaokes", Toast.LENGTH_SHORT).show();
}else{
Log.i("Category - response", _karaoke_category_response.toString());
_karaoke_category_adapter = new ArrayAdapter<String>(getSupportActionBar().getThemedContext(), R.layout.spinner_item,_karaoke_category_response);
getSupportActionBar().setListNavigationCallbacks(_karaoke_category_adapter, this);
}

下面的代码是搜索该类别的歌曲并设置

    class AsyncKaraoke extends AsyncTask<Void, Void, Void> {
String category;

public AsyncKaraoke(String category) {
this.category = category;
}

protected void onPreExecute(){
super.onPreExecute();
setSupportProgressBarIndeterminateVisibility(true);
}

@Override
protected Void doInBackground(Void... params) {
java.io.InputStream source = null;

try {
source = retrieveStream(UrlApi.URL_BASE + UrlApi.URL_STORE + _bundle.getString("_id") + UrlApi.KARAOKE_URL + UrlApi.FILTER_CATEGORY + URLEncoder.encode(category, "UTF-8"));
Log.i("URL - KARAOKE", UrlApi.URL_BASE + UrlApi.URL_STORE + _bundle.getString("_id") + UrlApi.KARAOKE_URL + UrlApi.FILTER_CATEGORY + URLEncoder.encode(category, "UTF-8"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
Reader reader = new InputStreamReader(source);
Type karaokeCollection = new TypeToken<Collection<KaraokeModel>>() {}.getType();
_response = new Gson().fromJson(reader, karaokeCollection);
Log.i("Response - KaraokeCategory" , _karaoke_category_response.toString());
return null;
}
protected void onPostExecute(Void Void){
super.onPostExecute(Void);
setSupportProgressBarIndeterminateVisibility(false);
_karaoke_adapter = new KaraokeAdapter(KaraokeActivity.this, _bundle.getString("_id"), _response);
if(_response.size() == 0){
Toast.makeText(getApplicationContext(), "Categoria sin karaoke", Toast.LENGTH_SHORT).show();
}
_list_view.setAdapter(_karaoke_adapter);
_karaoke_adapter.notifyDataSetChanged();
}


}

我应该如何调用“AsyncTask”方法两次并防止 Activity 参与几秒钟?

最佳答案

AsyncTask 的主要规则是它必须始终在主线程上创建和运行。如果您在 doInBackground() 方法内启动另一个 AsyncTask,您将收到异常。您的选择是在其中一个回调中启动下一个 AsyncTask。一般来说,有些人会在onPostExecute()方法中链接AsyncTask,但你也可以在onPreExecute()onProgressUpdate中启动它们().

编辑:

此外,您可以使用 AsyncTask#executeOnExecutor() 依次运行 AsyncTask 。从 HoneyComb 开始,您不需要这样做。所有 AsyncTask 按照执行顺序在串行线程池中运行。不过,如果您使用它,可能会更容易理解代码是串行运行的。如果使用 Android Android 1.6 - 2.3.x,则确实需要链接。

关于java - 是否可以在另一个方法 "AsyncTask"中运行 "AsyncTask"方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22073431/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com