java - 安卓 : Get data in real-time instead of using Async-Task

标签 java android multithreading asynchronous android-asynctask

我对 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/

相关文章:

Android Roboguice 扩展一个 Robo 类的目的是什么?

java - 在同一轴上平移和旋转时出现奇怪的行为

android - TextToSpeech Android 的自定义语音

c# - DoEvents 与其他任何东西 --> 对于长时间的 COM 操作

java - 有没有办法在 Java 中声明方法 "friendly"?

java - 通用列表和 for-each 循环

java - 在 Java 中将输入流转换为数组的最佳方法是什么?

c++ - std::vector<std::string> 的内容消失

java - 多次将对象设置为 null 是否会影响性能?

java - 防止 Spring Boot 缓存文件