我刚开始玩android和java(c#dev)。我写了一些用于在后台加载数据的代码,对我来说感觉不对,但我想得到一些专家的意见。
所以这就是:
我有一个基本模型:
public class Site {
private String name;
public String getName(){return name;}
public void setName(String value){name=value;}
}
异步侦听器:
public interface IAsyncListener<T> {
public void onTaskDone(T data);
}
数据访问模块:
public ArrayList<Site> getAllSites() {
ArrayList<Site> sites = new ArrayList<Site>();
for (int i = 0; i < 10; i++) {
Site newSite = new Site();
newSite.setName("Site" + 1);
sites.add(newSite);
}
return sites;
}
public void getAllSitesAsync(final IAsyncListener<ArrayList<Site>> listener){
new AsyncTask<Void, Void, ArrayList<Site>>() {
@Override
protected ArrayList<Site> doInBackground(Void... params) {
ArrayList<Site> sites = getAllSites();
return sites;
}
@Override
protected void onPostExecute(ArrayList<Site> result) {
listener.onTaskDone(result);
}
}.execute();
}
最后我在我的活动中使用了数据:
private void fetchSites() {
AppEngine.getInstance().getData().getAllSitesAsync(new IAsyncListener<ArrayList<Site>>() {
@Override
public void onTaskDone(ArrayList<Site> data) {
progressDialog.dismiss();
sitesListView = (ListView) findViewById(R.id.sitesListView);
sites = data;
sitesArrayAdapter = new ArrayAdapter<>(getApplicationContext(), R.layout.adapter_item_site, sites);
sitesListView.setAdapter(sitesArrayAdapter);
sitesListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> a, View v, int i, long l) {
loadSite(sites, i);
}
});
}
});
}
非常感谢所有输入。
答案 0 :(得分:1)
我说一般的想法很好,除了一些非Android问题(丑陋的代码,但我想它只是一个概念证明)。
注意事项:
此类问题有专门的StackExchange网站:Code Review:)
看起来您的getAllSites()
最终将使用网络或数据库提取。请注意,在.execute()
上调用AsyncTask
将在未来的某个单线程后台执行程序上运行它。如果您打算缓存第一个查询的结果,这可能没问题,提供了一个不大的数据集。在其他情况下,您最终可能会遇到被其他AsyncTask
阻塞的单个核心执行程序。这种工作通常应该使用.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR)
- 一个多线程执行器,通常配置为适合给定设备的线程数。
每次获得新数据时,您都不需要重新创建ListView
Adapter
。您可以使用BaseAdapter
方法对自定义类进行扩展(通常需要扩展set*
),在其中您将调用notifyDataSetChanged()
以通知列表有关更改。应在应用程序主线程上调用set*
方法,因此您应该使用runOnUiThread(Runnable)
的{{1}}方法。或者,您始终可以使用一些基本的,提供的适配器,这些适配器也允许更改数据。
Activity
通常在任何一种语言中都是错误的。如果您打算继续使用Android,请查看Dagger库。对于Java初学者来说可能有点苛刻,但是你很快就会看到它们的优点。 Android代码必须采用一些特殊护理,因为它喜欢弄乱。