簡體   English   中英

Android:在循環中使用異步任務填充微調框列表

[英]Android : Populate a spinner list with async task in a loop

我在使用多個異步任務填充微調框列表以獲取數據時遇到問題。

第一個問題是要顯示進度對話框並隱藏它嗎? (有多個異步任務的問題)

每次創建和設置新適配器是否正確?

這是我的代碼

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


    }

}

AsyncTasks的效率很低,所以我建議僅使用一個AsyncTask。 那將解決您當前的所有問題。 您將在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();
    }
}

對於您的情況來說,這是一個簡單的技巧,因為它是多個AsyncTask,所以請在SOAPCall構造函數中以及每個AsyncTask的onPostExecute()中初始化ProgressDialog,檢查ProgressDialog是否為null。 如果不為null,則調用ProgressDialog.dismiss() ,否則不執行任何操作。

您不必每次都設置一個新的ADAPTER,因此很難控制數據源(ArrayList)。 制作一個自定義的Spinner適配器,實現自己的ArrayList更新方法,然后在更新陣列列表時調用SpinnerAdapter.notifyDataSetChanged()

PS:這是一個非常糟糕的做法,因此,請僅堅持使用一個AsyncTask。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM