【发布时间】:2017-06-02 09:20:00
【问题描述】:
我有一个进行大量同步网络调用的 android 库,我打算在我的应用程序中使用这个库。例如,当应用程序启动时,我需要显示用户列表、用户组列表和一般信息。为此,我已经有一个主要活动,它包含三个片段(两个列表片段和一个普通片段)用于显示三个内容,用户列表和用户组列表的数据来自前面提到的库中的同步网络调用.我的问题是,使用这些同步库调用来获取要由片段显示的数据的正确(推荐)方法是什么。据我了解,有 3 种主要方法可以做到这一点。
-
使用 AsyncTask 类,所以对于库方法 getUserList(...) 我必须创建一个专用的 AsyncTask 类。
public class FetchTask extends AsyncTask<Void, Void, Boolean> { private List<User> users; protected Boolean doInBackground(Void... params) { users = getUserList(...); } protected void onPostExecute(final Boolean success) { //inform user list fragment that user data has been fetched successfully }}
如果我 使用这个方法意味着我必须创建一个 asyncTask 类 对于每个网络调用(这是一个很大的数量)并且有 它在完成时与 UI 线程通信
-
直接分离一个线程来包装同步调用
public class UserListFragment extends ListFragment { private List<User> users; private ArrayAdapter<User> userAdapter .... protected void OnCreate(Bundle savedInstance) { super.OnCreate new Thread(new Runnable(){ public void run(){ users = getUserList() //notify array adapter that data has changed } }) } }
此方法还要求我对我进行的每个同步方法调用都重复此操作,并且很容易变得笨拙。
- 最后一种方法是使用 Threadpoolexecutor,我必须承认我 还没有完全理解这个方法。
再次,我的问题是实现这一目标的首选方法是什么?是我列出的 3 个中的任何一个吗?谢谢。
【问题讨论】:
-
不要将 AsyncTask 用于网络调用。使用任何网络库
-
我建议你使用 Retrofit
-
Do not use an AsyncTask for a network call。废话@超人。使用 AsyncTask 或线程是要走的路。你甚至必须这样做。 -
没有推荐的方式。只需尝试所有这些,然后使用其中一个。您将首先显示一个新的 gui。然后启动一个任务或线程,最后更新 gui。
标签: java android multithreading android-fragments android-asynctask