我对Android编程相对陌生,但我确实来自Java背景,为企业应用程序构建后端工具。现在,我正在开发一个Android项目,在该项目中,我想从服务器中检索餐馆的java.util.List。Android:实时获取数据而不是使用异步任务
目前,为了实现这些任务,我使用了一个简单的线程和一个新的Runnable,因为线程立即在线程池中,然后我可以简单地加入线程,并等待它从服务器收到回复然后发回。非常方便,这是工作良好。
但是,有两件事情我不能使用线程来检查客户端的Internet连接并显示一个进度条。据我了解和阅读,这两个东西可以通过AsyncTask来实现。
但是,这里是关键点,我不希望AsyncTask在不久的将来执行,然后返回结果,因为使用当前的Thread模型,我可以简单地加入Thread并放松。
现在,我的问题是,在AsyncTask中是可能的,我不是说在1000毫秒后使用get方法。我的意思是真的在等待它。我如何实现这一目标?就此,我想知道如何检查INternet,如果成功,那么只能提出请求。
这是我在项目中的异步方法之一,然后下一个是我在项目中使用的简单线程模型。
private class LoginUserViaRest extends AsyncTask<Void, Void, String> {
@Override
protected String doInBackground(Void... params) {
final EditText userEmail = (EditText) findViewById(R.id.usernameText);
final EditText userPassword = (EditText) findViewById(R.id.PasswordField);
rest.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
StaticRestTemplate.jsessionid = rest.execute(StaticRestTemplate.baseURL+"j_spring_security_check", HttpMethod.POST,
new RequestCallback() {
@Override
public void doWithRequest(ClientHttpRequest request) throws IOException {
request.getBody().write(("j_username=" + userEmail.getText().toString() + "&j_password=" + userPassword.getText().toString()).getBytes());
}
}, new ResponseExtractor<String>() {
@Override
public String extractData(ClientHttpResponse response) throws IOException {
List<String> cookies = response.getHeaders().get("Cookie");
if (cookies == null) {
cookies = response.getHeaders().get("Set-Cookie");
}
String cookie = cookies.get(cookies.size() - 1);
int start = cookie.indexOf('=');
int end = cookie.indexOf(';');
return cookie.substring(start + 1, end);
}
});
return null;
}
@Override
protected void onPostExecute(String aVoid) {
super.onPostExecute(aVoid);
}
}
线程来检索图片:
@Override
public List<RestImage> getImagesForMenuCard(final int menuCardId) {
final RestTemplate restTemplate = StaticRestTemplate.getRest();
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
HttpHeaders requestHeaders = new HttpHeaders();
requestHeaders.add("Cookie", "JSESSIONID=" + StaticRestTemplate.jsessionid);
requestHeaders.setAccept(Collections.singletonList(new MediaType("application", "json")));
HttpEntity<?> requestEntity = new HttpEntity<Object>(requestHeaders);
restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
menuCardImageEntity = restTemplate.exchange(menucardImageList + menuCardId, HttpMethod.GET, requestEntity, RestImage[].class);
}
});
thread.start();
try {
thread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
RestImage[] restImages = menuCardImageEntity.getBody();
List<RestImage> restImageList = new ArrayList<>();
Collections.addAll(restImageList, restImages);
return restImageList;
}
我找到线程模型很容易,因为我更好地了解它。我真的不明白需要创建一个类来发出网络请求。 我对AsyncTask的理解是否被破坏,或者这是它应该是的方式。对于大量文字的道歉,我想简明扼要地解释我的情况。非常感谢。
不幸的是,Android不支持Java8,否则我只会在线程中添加Lambda表达式来创建一个更紧凑的版本。 –
使用AsyncTask被称为无痛线程,以下是Android开发人员有关AsyncTask与线程:[无痛线程](http://android-developers.blogspot.com/2009/05/painless-threading.html)和另一个很好的阅读在这里:[处理器VS AsyncTask与线程](http://stackoverflow.com/a/9800870/593709) –
@AdilSoomro:我没有长时间运行的任务,既不频繁的UI更新...你给的链接只是指以表明有人冻结视图。不相关,因为我想在进行网络请求时显示进度条。 –