2016-08-11 5 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, которая является лучшей библиотекой, которая будет использоваться в качестве HTTP-клиента. Дайте ему шанс, и вы никогда не вернетесь. Вот как вы это делаете в «Дооснащении».

Это, как вы определяете конечные точки в Модернизированный

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

Затем отправить JSON на сервер в теле API REST сделать две вещи. Сначала определим его, как показано ниже

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

А в вашей деятельности вы используете его, как показано ниже

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

Вся ваша AsyncTask деятельность осуществляется в вызове выше. Это так просто.

Выше вызова будет посылать ниже JSON на сервер

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

Я не понимаю, класс пользователя. –

+0

Пользовательский класс - это простой POJO. –

+0

http://www.jsonschema2pojo.org используйте это, чтобы создать POJO для вашего json –

Смежные вопросы