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
方法接受一个参数列表(或数组或单个或无),这些参数可以是关系对象。