Может ли Java FutureTask быть альтернативой AsyncTask?

В документах говорится, что AsyncTask предназначен для обработки коротких операций (максимум несколько секунд) и говорится, что классы Java, такие как FutureTask, лучше подходят для операций, которые длятся долго. Поэтому я попытался отправить обновления своего местоположения на сервер с помощью FutureTask, но получаю исключение NetworkOnMainThreadException. Я не хочу использовать AsyncTask, потому что я хотел оставить http-соединение открытым, пока обновления не будут отменены. Вот мой код:

SendLocation updates = new SendLocation(idt, String.valueOf(location.getLatitude()), String.valueOf(location.getLongitude()));

                            FutureTask ft = new FutureTask<String>(updates);
                            boolean b = ft.cancel(false);
                            ft.run();

class SendLocation implements Callable<String> {
        String t, la, lo;
        public SendLocation(String a, String b, String c){
            this.t = a;
            this.la = b;
            this.lo = c;
        }
        public String call() {
            sendUpdates(token, la, lo);
            return "Task Done";
        }

        public void sendUpdates(String a, String b, String c){
            HttpURLConnection urlConn = null;
            try {
                    try {
                        URL url;
                        //HttpURLConnection urlConn;
                        url = new URL(remote + "driver.php");
                        urlConn = (HttpURLConnection) url.openConnection();
                        System.setProperty("http.keepAlive", "true");
                        //urlConn.setDoInput(true); //this is for get request
                        urlConn.setDoOutput(true);
                        urlConn.setUseCaches(false);
                        urlConn.setRequestProperty("Content-Type", "application/json");
                        urlConn.setRequestProperty("Accept", "application/json");
                        urlConn.setRequestMethod("POST");
                        urlConn.connect();
                        try {
                            //Create JSONObject here
                            JSONObject json = new JSONObject();
                            json.put("drt", a);
                            json.put("drlat", b);
                            json.put("drlon", c);
                            String postData = json.toString();

                            // Send POST output.
                            OutputStreamWriter os = new OutputStreamWriter(urlConn.getOutputStream(), "UTF-8");
                            os.write(postData);
                            Log.i("NOTIFICATION", "Data Sent");

                                os.flush();
                                os.close();

                            BufferedReader reader = new BufferedReader(new InputStreamReader(urlConn.getInputStream()));
                            String msg = "";
                            String line = "";
                            while ((line = reader.readLine()) != null) {
                                msg += line;
                            }
                            Log.i("msg=", "" + msg);

                        } catch (JSONException jsonex) {
                            jsonex.printStackTrace();
                            Log.e("jsnExce", jsonex.toString());
                        }
                    } catch (MalformedURLException muex) {
                        // TODO Auto-generated catch block
                        muex.printStackTrace();
                    } catch (IOException ioex) {
                        ioex.printStackTrace();
                        try { //if there is IOException clean the connection and clear it for reuse(works if the stream is not too long)
                            int respCode = urlConn.getResponseCode();
                            InputStream es = urlConn.getErrorStream();
                            byte[] buffer =  null;
                            int ret = 0;
                            // read the response body
                            while ((ret = es.read(buffer)) > 0) {
                                Log.e("streamingError", String.valueOf(respCode) +  String.valueOf(ret));
                            }
                            // close the errorstream
                            es.close();
                        } catch(IOException ex) {
                            // deal with the exception
                            ex.printStackTrace();
                        }
                    }
            } catch (Exception e) {
                e.printStackTrace();
                Log.e("ERROR", "There is error in this code " + String.valueOf(e));
            }
        }
    } 

Разве это не выполняется в рабочем потоке? Если ответ "нет", почему в документах говорится, что это альтернатива AsyncTask?

1 ответ

Ваш код не должен быть в методе void run(). Именно здесь выполняется асинхронный код.

Другие вопросы по тегам