2016-05-26 11 views
0

ドキュメントは、AsyncTaskは短い操作(最大数秒)を処理するように設計されていて、FutureTaskのようなJavaクラスは長く続く操作に適していると述べています。だから、私はFutureTaskを使ってサーバーに自分の位置の更新を送ろうとしましたが、NetworkOnMainThreadExceptionを取得しています。更新がキャンセルされるまで、http接続を開いたままにしておきたいので、私はAsyncTaskを使いたくありません。ここに私のコードです:JavaのFutureTaskをAsyncTaskの代わりに使用できますか?

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)); 
      } 
     } 
    } 

ワーカースレッドで実行されませんか?答えが「いいえ」の場合、docs say that it is an alternative to AsyncTaskはなぜですか?

+0

は、 'SendLocation'を呼び出すコードを示しています。 –

+0

あなたはこれらのすべてを捨て、改造やボレーを使用してください、彼らは今最高です – meda

答えて

0

コードはvoid run()メソッド内にあってはなりません。これが非同期コードが実行される場所です。

+0

私のすべてのコードは、run()メソッドではなくcall()メソッドで呼び出されます。 –

関連する問題