我正在通过按下按钮到本地网络服务器来发布我手机的当前位置。 Web服务器正确接收POST。
但是,出于某种原因,我只能向服务器发送一个位置,之后Async Task只被调用一次。 编辑:调用异步任务,但不调用doInBackground方法。 - 然后按下每个后续按钮按下任务未到达。我确实在上面的链接中读到它只能被调用一次,但我认为每个对象只有一次 - 而且出于某种原因,在我改变了一些东西之前这一切都工作得很好而且都搞砸了。
我需要能够在几分钟内从手机发送数百个这样的请求,因此这里的任何指导都很有用。谢谢!
package com.spencer.gps;
import android.app.Activity;
import android.content.Context;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends Activity{
private TextView latituteField;
private TextView longitudeField;
private LocationManager locationManager;
private String provider;
LocationManager mlocManager = null;
LocationListener mlocListener;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mlocManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
mlocListener = new MyLocationListener();
mlocManager.requestLocationUpdates( LocationManager.NETWORK_PROVIDER, 0, 0, mlocListener);
final Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
getAndSendLocation();
}
});
/*new Timer().scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
runOnUiThread(new Runnable() {
@Override
public void run() {
getAndSendLocation();
}
});
}
}, 0, 1000);*/
}
public void getAndSendLocation() {
final TextView latitudeField = (TextView) findViewById(R.id.lat);
final TextView longitudeField = (TextView) findViewById(R.id.longit);
if (mlocManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) {
latitudeField.setText("Latitude: " + MyLocationListener.latitude + '\n');
longitudeField.setText("Longitude: " + MyLocationListener.longitude + '\n');
new doPost().execute(MyLocationListener.latitude, MyLocationListener.longitude);
} else {
latitudeField.setText("GPS is not turned on...");
longitudeField.setText("GPS is not turned on...");
}
}
public class doPost extends AsyncTask {
@Override
protected Object doInBackground(Object[] objects) {
double lat = (Double) objects[0];
double longit = (Double) objects[1];
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("http://192.168.1.110:3000/coord");
try {
// Add your data
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
nameValuePairs.add(new BasicNameValuePair("lat", Double.toString(lat)));
nameValuePairs.add(new BasicNameValuePair("long", Double.toString(longit)));
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
HttpResponse response = httpclient.execute(httppost);
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
} catch (IOException e) {
// TODO Auto-generated catch block
}
return null;
}
}
/* Request updates at startup */
@Override
protected void onResume() {
super.onResume();
}
/* Remove the locationlistener updates when Activity is paused */
@Override
protected void onPause() {
super.onPause();
}
}
答案 0 :(得分:1)
根据文件:
注意:此函数根据平台版本为单个后台线程或线程池调度队列上的任务。首次引入时,AsyncTasks在单个后台线程上串行执行。从DONUT开始,这被改为一个线程池,允许多个任务并行运行。启动HONEYCOMB,任务将恢复在单个线程上执行,以避免由并行执行引起的常见应用程序错误。如果您真的想要并行执行,可以使用THREAD_POOL_EXECUTOR使用此方法的executeOnExecutor(Executor,Params ...)版本;但是,请在那里查看有关其使用的警告。
所以,你应该这样打电话:
new doPost(). executeOnExecutor(AsyncTask. THREAD_POOL_EXECUTOR , MyLocationListener.latitude, MyLocationListener.longitude);
这将并行执行所有线程,并对此方法进行API 11检查。
希望有所帮助。 :)