Java 许多涉及网络操作的功能
我有一个函数,它执行对RESTAPI的请求,RESTAPI使用httpPost。因此,在使用一些nameValuePair和UrlEncodedFormEntity魔术设置所有内容之后,我有以下代码:Java 许多涉及网络操作的功能,java,android,Java,Android,我有一个函数,它执行对RESTAPI的请求,RESTAPI使用httpPost。因此,在使用一些nameValuePair和UrlEncodedFormEntity魔术设置所有内容之后,我有以下代码: try { httpPost.setEntity(new UrlEncodedFormEntity(nameValuePair)); // parsing the response here } catch (UnsupportedEncodingE
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”);
我花了一些时间来理解改装是如何工作的,但我终于让它启动并运行起来了,它做得非常漂亮,而且代码非常干净!非常感谢。