2016-08-11 8 views
0

JSONArrayをサーバーにポストする必要があります.HttpUrlConnectionを試しましたが、私の場合はASyncTaskの使用方法がわかりません。POST JSONArrayをHttpUrlConnectionを使用してサーバーに接続する

私のonLocationChangedメソッドでは、JSONを10秒ごとにポストする必要があります。誰もこれを行う方法を知っていますか?

public class MainActivity extends AppCompatActivity implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, LocationListener{ 

    private final String LOG_TAG = "iTrackerTestApp"; 
    private TextView txtLatitude, txtLongitude, txtAltitude, txtVelocidade; 
    private GoogleApiClient mGoogleApiClient; 
    private HttpURLConnection urlConnection = null; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     mGoogleApiClient = new GoogleApiClient.Builder(this) 
       .addApi(LocationServices.API) 
       .addConnectionCallbacks(this) 
       .addOnConnectionFailedListener(this) 
       .build(); 

     txtLatitude = (TextView) findViewById(R.id.txtLatitude); 
     txtLongitude = (TextView) findViewById(R.id.txtLongitude); 
     txtAltitude = (TextView) findViewById(R.id.txtAltitude); 
     txtVelocidade = (TextView) findViewById(R.id.txtVelocidade); 
    } 

    @Override 
    public void onConnected(Bundle bundle) { 
     LocationRequest mLocationRequest = LocationRequest.create(); 
     mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 
     mLocationRequest.setInterval(1000); // Atualiza a localização a cada segundo. 
     LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this); 
    } 

    @Override 
    public void onLocationChanged(Location location) { 
     Log.i(LOG_TAG, location.toString()); 

     txtLatitude.setText("Latitude: " + Double.toString(location.getLatitude())); 
     txtLongitude.setText("Longitude: " + Double.toString(location.getLongitude())); 
     if(location.hasAltitude()) 
      txtAltitude.setText("Altitude: " + Double.toString(location.getAltitude())); 
     if(location.hasSpeed()) 
      txtVelocidade.setText("Velocidade: " + Float.toString(location.getSpeed())); 

     final JSONArray array = new JSONArray(); 
     JSONObject jsonObject = new JSONObject(); 

     try { 
      jsonObject.put("Latitude", txtLatitude.getText()); 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 

     try { 
      jsonObject.put("Longitude", txtLongitude.getText()); 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 

     array.put(jsonObject); 

     // I NEED TO SEND THIS JSON TO SERVER EVERY 10 SECONDS 
    } 

    @Override 
    protected void onStart(){ 
     super.onStart(); 
     mGoogleApiClient.connect(); 
     setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
    } 

    @Override 
    protected void onStop(){ 
     mGoogleApiClient.disconnect(); 
     super.onStop(); 
    } 

    @Override 
    public void onConnectionSuspended(int i) { 
     Log.i(LOG_TAG, "Conexão com o GoogleApiClient suspensa!"); 
    } 

    @Override 
    public void onConnectionFailed(ConnectionResult connectionResult) { 
     Log.i(LOG_TAG, "Conexão com o GoogleApiClient falhou!"); 
    } 
} 

答えて

2

結構ですが、ASyncTaskは古いスタイルで多くのボイラープレートのコーディングです。 Retrofitに切り替える必要があります。Retrofitは、HTTPクライアントとして使用するのに最適なライブラリです。それを打つと、あなたは戻ってくることはありません。 Retrofitでこれを行う方法は次のとおりです。

これは、あなたが2つのことを行うのREST APIのボディにサーバーにJSONを送信するために続いてレトロフィット

public static final String BASE_URL = "http://api.myservice.com/"; 
Retrofit retrofit = new Retrofit.Builder() 
    .baseUrl(BASE_URL) 
    .addConverterFactory(GsonConverterFactory.create()) 
    .build(); 

をお使いのエンドポイントを定義する方法です。まず

public interface MyApiEndpointInterface 
{ 
    @POST("users/new") 
    Call<User> createUser(@Body User user); 
} 

そして、あなたの活動のすべてのあなたのAsyncTask活性は上記の呼び出しで処理され

User user = new User(123, "John Doe"); 
Call<User> call = apiService.createuser(user); 
call.enqueue(new Callback<User>() { 
    @Override 
    public void onResponse(Call<User> call, Response<User> response) { 
    } 

    @Override 
    public void onFailure(Call<User> call, Throwable t) { 
    } 

以下のようにあなたがそれを使用し、以下のように定義します。それはそれと同じくらい簡単です。コール以上

は、私はUserクラスを理解していないサーバー

{"name":"John Doe","id":123} 
+0

にJSONの下に送信されます。 –

+0

ユーザークラスは単純なPOJOです。 –

+0

http://www.jsonschema2pojo.orgこれを使用してjsonのPOJOを作成します –

関連する問題