Android:在循环中使用异步任务填充微调器列表
我在使用多个异步任务填充微调器列表以检索数据时遇到问题 第一个问题是显示进度对话框并隐藏它?(多个异步任务的问题) 每次创建和设置新适配器是否正确 这是我的密码Android:在循环中使用异步任务填充微调器列表,android,asynchronous,Android,Asynchronous,我在使用多个异步任务填充微调器列表以检索数据时遇到问题 第一个问题是显示进度对话框并隐藏它?(多个异步任务的问题) 每次创建和设置新适配器是否正确 这是我的密码 public void getEntities(Entity account) { final ArrayList <Entity> entities = new ArrayList <Entity>(); Log.i(TAG, String.valueOf(account.getRelati
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"));
}
}
公共实体(实体账户){
最终ArrayList实体=新ArrayList();
Log.i(TAG、String.valueOf(account.getRelationships().size());
for(最终关系:account.getRelationships()){
新SOAPCall(){
@凌驾
受保护的void onPostExecute(字符串soapResponse){
final DataMap dm=ParseSoapResponse.parseEntity(soapResponse);
Entity ent=新实体(dm.getDataMapArrayList(“items”).get(0.getString(“displayName”));
setLogicalName(relationship.getReferenceEntity());
实体。添加(ent);
SpinNerAdaptenties=new ArrayAdapter(getApplicationContext(),android.R.layout.simple\u微调器\u项,实体);
SpinNerAdapteries.setDropDownViewResource(android.R.layout.simple\u微调器\u下拉菜单\u项);
_微调器实体1.设置适配器(微调器适配器实体);
}
}.execute(SoapRequest.getInstance(getBaseContext()).getRetrieveEntityRequest(relationship.getReferenceEntity(),“Entity”);
}
}
异步任务效率很低,因此我建议只使用一个异步任务。这将解决你目前所有的问题。您将在onPreExecute中显示进度,在doInBackground中显示循环槽关系,在onProgressUpdate中更新适配器,并在onPostExecute中隐藏进度。异步任务效率很低,因此我建议只使用一个异步任务。这将解决你目前所有的问题。您将在onPreExecute中显示进度,在doInBackground中循环槽关系,在onProgressUpdate中更新适配器,并在onPostExecute中隐藏进度。使用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();
}
}
私有类DoSomething扩展了异步任务{
进展性帕金森病;
@凌驾
受保护的void onPreExecute(){
pd=ProgressDialog.show(上下文,null,“加载…”);
}
@凌驾
受保护的Void doInBackground(Void…参数){
//在这里做点什么。。。
返回null;
}
@凌驾
受保护的void onPostExecute(void避免){
pd.解散();
}
}
在您的例子中,使用一个简单的hack,因为它是一个多异步任务,所以在SOAPCall
构造函数中初始化ProgressDialog,并在每个异步任务的onPostExecute()
中检查ProgressDialog
是否为空。如果不为null,则调用ProgressDialog.dismise()
,否则不执行任何操作
您不会每次都设置一个新的适配器,很难控制数据源(ArrayList)。制作一个自定义微调器适配器,实现自己的ArrayList更新方法,然后在更新数组列表时调用SpinnerAdapter.notifyDataSetChanged()
注意:这是一种非常糟糕的做法,因此,请只坚持一个AsyncTask。使用
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();
}
}
私有类DoSomething扩展了异步任务{
进展性帕金森病;
@凌驾
受保护的void onPreExecute(){
pd=ProgressDialog.show(上下文,null,“加载…”);
}
@凌驾
受保护的Void doInBackground(Void…参数){
//在这里做点什么。。。
返回null;
}
@凌驾
受保护的void onPostExecute(void避免){
pd.解散();
}
}
在您的例子中,使用一个简单的hack,因为它是一个多异步任务,所以在SOAPCall
构造函数中初始化ProgressDialog,并在每个异步任务的onPostExecute()
中检查ProgressDialog
是否为空。如果不为null,则调用ProgressDialog.dismise()
,否则不执行任何操作
您不会每次都设置一个新的适配器,很难控制数据源(ArrayList)。制作一个自定义微调器适配器,实现自己的ArrayList更新方法,然后在更新数组列表时调用SpinnerAdapter.notifyDataSetChanged()
附言:这是一种非常糟糕的做法,因此,一定要坚持只执行一个AsyncTask。所以我应该将所有SOAP请求(例如在列表中)传递给我的SOAPCall类,并在一个异步任务中执行它们?@bidou88是的,AsyncTask的
execute
方法接受一个参数列表(或数组,或单个或无),哪些可以是关系对象。因此,我应该将所有SOAP请求(例如在列表中)传递给我的SOAPCall类,并在一个异步任务中执行它们?@bidou88是的,AsyncTask的execute
方法接受一个参数列表(或数组或单个或无),这些参数可以是关系对象。