我在使用多个异步任务填充微调器列表以检索数据时遇到问题。
第一个问题是显示进度对话框并隐藏它? (多个异步任务有问题)
每次创建和设置新适配器是否正确?
这是我的代码
public void getEntities(Entity account) {
final ArrayList <Entity> entities = new ArrayList <Entity>();
Log.i(TAG, String.valueOf(account.getRelationships().size()));
for(final Relationship relationship : account.getRelationships()) {
new SOAPCall() {
@Override
protected void onPostExecute(String soapResponse) {
final DataMap dm = ParseSoapResponse.parseEntity(soapResponse);
Entity ent = new Entity(dm.getDataMapArrayList("items").get(0).getString("displayName"));
ent.setLogicalName(relationship.getReferenceEntity());
entities.add(ent);
spinnerAdapterEntities = new ArrayAdapter <Entity> (getApplicationContext(), android.R.layout.simple_spinner_item, entities);
spinnerAdapterEntities.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
_spinner_entities1.setAdapter(spinnerAdapterEntities);
}
}.execute(SoapRequest.getInstance(getBaseContext()).getRetrieveEntityRequest(relationship.getReferenceEntity(), "Entity"));
}
}
答案 0 :(得分:2)
AsyncTasks效率很低,所以我建议只使用一个AsyncTask。这将解决您当前遇到的所有问题。您将在onPreExecute中显示进度,在doInBackground中循环关系,在onProgressUpdate中更新适配器并在onPostExecute中隐藏进度。
答案 1 :(得分:1)
使用onPreExecute()
和onPostExecute()
方法覆盖您的AsyncTask类。
示例:
private class DoSomething extends AsyncTask<Void, Void, Void> {
ProgressDialog pd;
@Override
protected void onPreExecute() {
pd = ProgressDialog.show(context, null, "Loading...");
}
@Override
protected Void doInBackground(Void... params) {
// Do something here...
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
pd.dismiss();
}
}
在你的情况下有一个简单的hack,因为它是一个多个AsyncTask,在你的SOAPCall
构造函数中启动你的ProgressDialog,并在每个AsyncTask的onPostExecute()
中,检查ProgressDialog
是否为null 。如果不为null,则调用ProgressDialog.dismiss()
,否则不执行任何操作。
每次都没有设置新的ADAPTER,很难控制数据源(ArrayList)。创建一个自定义Spinner适配器,实现自己的ArrayList更新方法,然后在更新阵列列表时调用SpinnerAdapter.notifyDataSetChanged()
。