2011-09-29 113 views

回答

4

所以這實際上應該相當容易。在實現細節方面,你並沒有真正給我們太多的工作,所以我會盡我所能對你進行半僞代碼編寫,並給你一個很好的一般答案。

我們希望從單獨的線程執行查詢,以便在等待網絡響應時不會阻塞UI線程。您可以通過多種不同的方式來執行此操作,包括使用AsyncTask,IntentService或某種Loader。我想在你的情況下,從AsyncTaskLoader類派生的自定義類將是最好的。因此,讓我們看看這將如何看(注意,如果你正在編寫這個應用程序的任何小於api級別11的任何東西,你需要訪問一些較新的apis來使用加載器,結賬http://developer.android.com/resources/articles/backward-compatibility.html)。

MyActivity extends Activity implements LoaderManager.LoaderCallbacks<List<SpinnerItem>>{ 
    private Adapter<SpinnerItem> spinnerAdapter; 
    private static final int SPINNER_LOADER_ID = 0; 

    public void onCreate(Bundle icicle){ 
    Spinner theSpinner = findViewById(R.id.the_spinner); 
    spinnerAdapater = new Adapter<SpinnerItem>(...); //create empty adapter 
    spinnerAdapater.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
    theSpinner.setAdapter(spinnerAdapater); 
    getLoaderManager().initLoader(SPINNER_LOADER_ID, null, this); 
    } 

    public Loader<List<SpinnerItems>> onCreateLoader(int id, Bundle arg){ 
    //Create and return your loader 
    } 

    public void onLoadFinish(Loader<List<SpinnerItem>> loader, List<SpinnerItem> data){ 
    //update your adapater with the new data 
    } 

    public void onLoaderReset(Loader<List<SpinnerItem>> loader){ 
    //clear out all the data in the adapter 
    } 

} 

這是所有非常直截了當的東西。您應該可以通過閱讀Android開發者頁面上的加載器,適配器等來填補空白。我們使用完整的「SpinnerItem」的「List」的事實當然取決於您的特定實現,您選擇使用的適配器的類型也是如此。隨意選擇你想要的任何實際的數據結構。有關詳細信息,請再次查閱Android開發者頁面。至於裝載機類的話,你會想要做這樣的事情:

MyNetworkLoader extends AsyncTaskLoader<List<SpinnerItem>> 
    public MyNetworkLoader(Context context){ 
    super(context); 
    } 

    List<SpinnerItem> loadInBackground(){ 
    //Get data from server 
    } 
} 

在loadInBackground方法,你會用你的CustomHttpClient查詢您的服務器,並轉換成響應某種數據結構(只和以前一樣,在這個例子中我們使用了「SpinnerItem」的「List」)。

作爲最後的注意事項,在您的網絡請求完成之前,您的微調器將變空。您可能想要包含某種邏輯,通知用戶正在加載微調器的內容。

就是這樣。新的加載程序api使事情變得非常簡單。