Android异步操作实现

时间:2015-08-29 18:05:04

标签: java android asynchronous

我刚开始玩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);
                }
            });
        }
    });
}

非常感谢所有输入。

1 个答案:

答案 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代码必须采用一些特殊护理,因为它喜欢弄乱。