我一直在解决这个问题。使用LocationListener和HttpUrlConnection发布数据在AsyncTask中的即时位置
我有一个AsyncTask,每20秒获取用户的网络位置并将数据发布到远程服务器。
我已请求的权限,如图属于
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
这里是MainActivitiy的OnCreate()和代码
public class TraficMain extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
setContentView(R.layout.activity_main);
new UrlPositionAsynck().execute();
}
private class UrlPositionAsynck extends AsyncTask<Void, Void , String> {
public double longitude, latitude;
public URL url;
protected LocationManager locationManager;
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
}
@Override
protected String doInBackground(Void... urlink) {
GPSPosition gpsPosition = new GPSPosition(TraficMain.this);
locationManager=(LocationManager)getSystemService(Context.LOCATION_SERVICE);
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 20000, 0, gpsPosition);
Position position = gpsPosition.getPosition();
String params= "lb_lo=" + position.getLb_longitude() + "&lb_la=" + position.getLb_latitude();
try {
url = new URL("http://myremote_url");
byte[] param=params.getBytes("UTF-8");
int postLength=param.length;
HttpURLConnection strConn = (HttpURLConnection) url.openConnection();
strConn.setDoOutput(true);
strConn.setInstanceFollowRedirects(false);
strConn.setRequestMethod("POST");
strConn.setConnectTimeout(60000);
strConn.setChunkedStreamingMode(0);
strConn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
strConn.setRequestProperty("charset", "utf-8");
strConn.setRequestProperty("Content-Length", Integer.toString(postLength));
strConn.setUseCaches(false);
OutputStream out=strConn.getOutputStream();
BufferedWriter data =new BufferedWriter(new OutputStreamWriter(strConn.getOutputStream()));
data.write(params);
data.flush();
data.close();
out.flush();
out.close();
BufferedReader br = new BufferedReader(new InputStreamReader((strConn.getInputStream())));
StringBuilder sb = new StringBuilder();
String output;
while ((output = br.readLine()) != null) {
sb.append(output);
}
}catch(IOException io){
Log.i("Connection Problem :", io.getMessage());
}
return null;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
}
}
}
的其余部分,我用这个类实现获得位置LocationListener
public class GPSPosition implements LocationListener{
Activity myContext;
public double longitude, latitude;
public GPSPosition(Activity context){
this.myContext=context;
}
@Override
public void onLocationChanged(Location location) {
longitude = location.getLongitude();
latitude = location.getLatitude();
TextView txt = (TextView) this.myContext.findViewById(R.id.txtPosition);
txt.setText(longitude + ", " + latitude);
}
@Override
public void onProviderDisabled(String provider) {}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {}
@Override
public void onProviderEnabled(String provider) {}
public Position getPosition(){
return new Position(this.longitude, this.latitude);
}
我的代码已经过问题。我只在应用程序启动并且经度和纬度始终等于0时发布数据。
我期待将数据发布到远程服务器,每20秒钟一次。 有人可以告诉如何处理这个问题来解决吗?我已经花了整个周末
编辑 这是onCreate()的新代码。 即使设备更改位置,位置的值也不变,我不知道为什么会发生这种情况。
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
setContentView(R.layout.activity_main);
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
final GPSPosition gpsPosition = new GPSPosition(TraficMain.this);
locationManager=(LocationManager)getSystemService(Context.LOCATION_SERVICE);
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, gpsPosition);
new UrlPositionAsynck().execute(gpsPosition.getPosition());
}
}, 20000);
}
private class UrlPositionAsynck extends AsyncTask<Position, Void , String> {
public double longitude, latitude;
public URL url;
protected LocationManager locationManager;
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
}
@Override
protected String doInBackground(Position... urlink) {
Position position = urlink[0];
String params= "lb_lo=" + position.getLb_longitude() + "&lb_la=" + position.getLb_latitude();
try {
url = new URL("http://remote_url");
byte[] param=params.getBytes("UTF-8");
int postLength=param.length;
HttpURLConnection strConn = (HttpURLConnection) url.openConnection();
strConn.setDoOutput(true);
strConn.setInstanceFollowRedirects(false);
strConn.setRequestMethod("POST");
strConn.setConnectTimeout(60000);
strConn.setChunkedStreamingMode(0);
strConn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
strConn.setRequestProperty("charset", "utf-8");
strConn.setRequestProperty("Content-Length", Integer.toString(postLength));
strConn.setUseCaches(false);
OutputStream out=strConn.getOutputStream();
BufferedWriter data =new BufferedWriter(new OutputStreamWriter(strConn.getOutputStream()));
data.write(params);
data.flush();
data.close();
out.flush();
out.close();
BufferedReader br = new BufferedReader(new InputStreamReader((strConn.getInputStream())));
StringBuilder sb = new StringBuilder();
String output;
while ((output = br.readLine()) != null) {
sb.append(output);
}
}catch(IOException io){
io.printStackTrace();
}
return null;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
}
}
东西那么你正在执行一次你的AsyncTask每20秒后运行它。 –
你的意思是我应该在doInBackGround里添加一个while循环吗? –