2011-09-29 107 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使事情变得非常简单。