许多涉及网络操作的功能

时间:2014-10-17 17:28:58

标签: java android

我有一个函数可以对使用httpPost的REST API执行请求。所以在使用一些nameValuePair和UrlEncodedFormEntity魔术来设置所有内容之后,我有了这段代码:

    try {
        httpPost.setEntity(new UrlEncodedFormEntity(nameValuePair));
        // parsing the response here
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }

这最初放在一个函数(一个公共String)中,它使用REST API的响应来返回一个访问令牌。此函数位于仅用于与API通信的类中。从我的主要活动中,我创建了这个类的实例,然后调用:

    String accesstoken = ApiHandler.login();

来自MainActivity。此访问令牌需要在应用程序中执行任何其他操作,因此必须在应用程序继续之前完成此操作。我将应用程序的上下文传递给ApiHandler,以便能够显示来自ApiHandler类的Toast消息和AlertDialogs。但是,我现在有几个问题:

如何将屏幕保持在从ApiHandler中的登录功能调用的progressdialog上,直到我有accessstoken?我尝试使用Thread,但是线程,登录函数作为一个整体和调用登录函数的主UI活动之间的通信似乎需要大量的工作。此外,更重要的是,它需要我使用thread.join(),因为如果它没有login()给出的访问令牌,应用程序就无法执行任何操作。 Logcat告诉我,这似乎冻结了UI,因为我收到一条消息,说它跳过了30到50帧,有些东西可能阻止了UI线程。

另一个问题是ApiHandler有很多功能,因为API有很多不同的调用,所以像AsyncTask这样的东西会使代码不可读,因为它会导致很多Asynctasks,并且每个函数都会返回不同类型的数据。为ApiHandler中的每个函数编写一个完整的Asynctask,以及它自己的doInBackground,onPostExecute和onPreExecute会使事情变得比它们看起来要困难得多。

那么从非活动类运行代码的最简单方法是什么,这需要网络连接而不冻结UI线程,并且响应应该实际上是同步的,因为应用程序中的许多操作都不能异步完成,当我有150个函数用于不同的API调用时,不会使代码混乱,每个函数都有自己的函数。

1 个答案:

答案 0 :(得分:0)

使用一些android lib进行异步HTTP操作。 Retrofit from sqaure非常棒。

来自改造文档

  

使用注释来描述HTTP请求:

     
      
  • 网址参数替换和查询参数支持
  •   
  • 对象转换为请求正文(例如,JSON,协议缓冲区)
  •   
  • 多部分请求正文和文件上传
  •   

示例代码

public interface GitHubService {
  @GET("/users/{user}/repos")
  List<Repo> listRepos(@Path("user") String user);
}


RestAdapter restAdapter = new RestAdapter.Builder()
    .setEndpoint("https://api.github.com")
    .build();

GitHubService service = restAdapter.create(GitHubService.class);


List<Repo> repos = service.listRepos("octocat");