我对 Android 编程比较陌生,但我确实有 Java 背景,为企业应用程序构建后端内容。现在,我正在开发一个 Android 项目,在该项目中我想从服务器检索 java.util.List of Restaurants。
目前,为了实现这些任务,我使用一个带有新的 Runnable 的简单线程,因为该线程立即位于线程池中,然后我可以简单地加入该线程,并等待它收到来自服务器的答复,然后然后将其寄回。这非常方便并且工作良好。但是,有两件事我无法使用线程执行,检查客户端的互联网连接并显示进度条。据我理解和阅读,这两件事都可以通过 AsyncTask 来实现。
但这里是关键点,我不希望 AsyncTask 在不久的将来执行然后返回结果,因为使用我当前的 Thread 模型,我可以简单地加入 Thread 并放松。
现在,我的问题是,在 AsyncTask 中是否也可能如此,我并不是说在 1000 毫秒后使用 get 方法。我的意思是实际上在等待。我该如何做到这一点?有了这个,我想知道如何检查互联网,如果成功,则只发出请求。
这是我在项目中拥有的异步方法之一,然后下一个是我在项目中拥有的简单线程模型。
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 的理解是否被破坏了,还是它应该是这样的。
对于大量的文字表示歉意,我想我会简洁地解释我的情况。多谢。
最佳答案
如果您调用 join(),您的线程正在等待另一个线程死亡。由于调用 join 的线程是主线程或 UI 线程,这意味着您正在阻塞 UI,这是您应该避免的事情。现在 - 我真的很讨厌 AsyncTask,但它是执行(可能)长时间运行任务的 Android 标准方式。您可以查看 IntentService(但您必须管理服务和 UI 之间的通信),或者您可以查看 RxJava 和 RxAndroid(这是我最喜欢的框架)。
关于检查连接,需要ConnectivityManager类,当然需要一个 Context。
关于java - 安卓 : Get data in real-time instead of using Async-Task,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32400268/