Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/200.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 许多涉及网络操作的功能_Java_Android - Fatal编程技术网

Java 许多涉及网络操作的功能

Java 许多涉及网络操作的功能,java,android,Java,Android,我有一个函数,它执行对RESTAPI的请求,RESTAPI使用httpPost。因此,在使用一些nameValuePair和UrlEncodedFormEntity魔术设置所有内容之后,我有以下代码: try { httpPost.setEntity(new UrlEncodedFormEntity(nameValuePair)); // parsing the response here } catch (UnsupportedEncodingE

我有一个函数,它执行对RESTAPI的请求,RESTAPI使用httpPost。因此,在使用一些nameValuePair和UrlEncodedFormEntity魔术设置所有内容之后,我有以下代码:

    try {
        httpPost.setEntity(new UrlEncodedFormEntity(nameValuePair));
        // parsing the response here
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }
这最初被放入一个函数(一个公共字符串),在该函数中,它使用RESTAPI的响应返回一个访问令牌。此函数位于一个仅用于与API通信的类中。在我的主要活动中,我创建了该类的一个实例,然后调用:

    String accesstoken = ApiHandler.login();
来自主要活动。在应用程序中执行任何其他操作都需要此访问令牌,因此必须在应用程序继续之前执行此操作。我将应用程序的上下文传递给ApiHandler,以便能够显示来自ApiHandler类的toast消息和AlertDialogs。但是,我现在有几个问题:

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

另一个问题是ApiHandler有很多函数,因为API有很多不同的调用,所以类似AsyncTask的东西会使代码不可读,因为它会导致很多AsyncTask,并且每个函数都返回不同类型的数据。为ApiHandler中的每个函数编写一个完整的Asynctask,再加上它自己的doInBackground、onPostExecute和onPreExecute,会使事情变得比看上去困难得多


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

使用一些android库进行异步HTTP操作。真是太棒了

来自改装文档

它使用注释来描述HTTP请求:

  • URL参数替换和查询参数支持
  • 对象转换为请求主体(例如,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");
公共接口服务{
@获取(“/users/{user}/repos”)
列出listRepos(@Path(“user”)字符串user);
}
RestAdapter RestAdapter=new RestAdapter.Builder()
.setEndpoint(“https://api.github.com")
.build();
GitHubService=restAdapter.create(GitHubService.class);
列表回购=service.listRepos(“octocat”);

我花了一些时间来理解改装是如何工作的,但我终于让它启动并运行起来了,它做得非常漂亮,而且代码非常干净!非常感谢。