Android:处理同步网络调用

Posted

技术标签:

【中文标题】Android:处理同步网络调用【英文标题】:Android: Handling synchronous network calls 【发布时间】: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。 【参考方案1】:

您应该使用 Volley 库进行网络操作,因为 volley 维护了调用完美网络 api 所需的所有必要方法。 点击Here

【讨论】:

库已经使用 HttpURLConnection 进行网络调用,问题是调用是同步的。我想找到一种将这些同步调用包装在异步进程中的方法。

以上是关于Android:处理同步网络调用的主要内容,如果未能解决你的问题,请参考以下文章

Android开源框架&Okhttp网络框架解析

如何为 Android 同步状态图标设置动画?

android中怎样让main线程和子线程同步一个变量

Android开发学习之OkHttp框架

Android开发学习之OkHttp框架

Android开发学习之OkHttp框架