我需要将JSONArray发布到服务器,我尝试了HttpUrlConnection,但我不知道如何在我的情况下使用ASyncTask。
在我的onLocationChanged方法中,我需要每隔10秒发布一次JSON。有谁知道怎么做?
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!");
}
}
答案 0 :(得分:2)
坦率地说,ASyncTask是旧式和大量的锅炉板编码。您需要切换到Retrofit,这是用作HTTP客户端的最佳库。试一试,你永远不会回头。以下是您在Retrofit中执行此操作的方法。
这是您在Retrofit中定义终点的方法
public static final String BASE_URL = "http://api.myservice.com/";
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build();
然后,要将您的JSON发送到REST API正文中的服务器,您可以执行两项操作。首先将其定义如下
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}