Android:在循环中使用异步任务填充微调器列表

时间:2015-11-18 09:52:53

标签: android asynchronous

我在使用多个异步任务填充微调器列表以检索数据时遇到问题。

第一个问题是显示进度对话框并隐藏它? (多个异步任务有问题)

每次创建和设置新适配器是否正确?

这是我的代码

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"));


    }

}

2 个答案:

答案 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()

P.S:这是一个非常糟糕的做法,因此,只坚持使用一个AsyncTask。