Android 如何使用天气API和位置管理器?
我有这样的代码。 这是关于创建的Android 如何使用天气API和位置管理器?,android,gps,locationmanager,Android,Gps,Locationmanager,我有这样的代码。 这是关于创建的 public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mgr=(LocationManager)getSystemService(Context.LOCATION_SERVICE); Location
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mgr=(LocationManager)getSystemService(Context.LOCATION_SERVICE);
LocationListener ll=new mylocatoinlis();
mgr.requestLocationUpdates(LocationManager.GPS_PROVIDER,3600l,0,ll);
}
这是位置侦听器类
protected class mylocatoinlis implements LocationListener {
public void onLocationChanged(Location location) {
// TODO Auto-generated method stub
if(location!=null)
{
double plong=location.getLongitude();
double plate=location.getLatitude();
//Log.i("MyLocation",Double.toString(plate)+" "+Double.toString(plong));
ingformation(plate,plong);
}
}
public void onProviderDisabled(String provider) {
// TODO Auto-generated method stub
}
public void onProviderEnabled(String provider) {
// TODO Auto-generated method stub
}
public void onStatusChanged(String provider, int status, Bundle extras) {
// TODO Auto-generated method stub
}
}
这是json包装函数
public void ingformation(double plate, double plong) {
// TODO Auto-generated method stub
try
{
client=new DefaultHttpClient();
StringBuilder url1=new StringBuilder(URL);
url1.append(plate+","+plong+".json");
HttpGet get=new HttpGet(url1.toString());
HttpResponse r=client.execute(get);
int status=r.getStatusLine().getStatusCode();
if(status==200){
HttpEntity e=r.getEntity();
String data=EntityUtils.toString(e);
obj= new JSONObject(data);
main=obj.getJSONObject("current_observation");
maintemp=main.getJSONObject("display_location");
tv1.setText(" "+maintemp.getString("city"));
tv3.setText(" "+main.getString("weather"));
tv2.setText(" "+main.getString("temp_c")+" C");
String imageName=main.getString("icon_url");
//String imageName1.append("nt_"+imageName);
//im.setImageURI(Uri.parse(url1.toString()+imageName));
if(imageName!="")
{
wv.setVisibility(View.VISIBLE);
wv.loadUrl(imageName);
}
else
{
wv.setVisibility(View.INVISIBLE);
}
//wv.loadUrl(imageName);
}
}catch(Exception e)
{
Log.e("JSON Parser", "Unable to connect" + e.toString());
}
}
如果我通过DDMS传递位置,它会给出类似NetworkOnMainThread异常的错误。
请帮助我粘贴了b/w位置和json。您需要在单独的线程中执行网络操作(
HTTPGet
)。使用一个工具最有效
编辑:
例如,添加以下内部类:
class MyTask extends AsyncTask<Double, Void, Void>
{
MyCallback callback;
public MyTask(Callback callback)
{
this.callback = callback;
}
@Override
public Void doInBackground(Double... coordinates)
{
double plong = coordinates[0];
double plat = coordinates[1];
//...Complete task
return null;
}
@Override
public void onPostExecute()
{
callback.go();
}
}
public interface Callback
{
//override to handle actions after task completes
public void go();
}
类MyTask扩展了AsyncTask
{
MyCallback回调;
公共MyTask(回调)
{
this.callback=回调;
}
@凌驾
公共无效doInBackground(双…坐标)
{
双普隆=坐标[0];
双平面=坐标[1];
//…完成任务
返回null;
}
@凌驾
public void onPostExecute()
{
callback.go();
}
}
公共接口回调
{
//重写以在任务完成后处理操作
公开作废go();
}
您需要使用AsyncTask,因为从蜂巢开始,您不能在主线程(进程)中使用网络进程,搜索异步任务但是如何将经度和纬度传递给异步任务?是的,您说的是正确的。但是如何从onLocationChanged返回数组?它不支持返回值。请使用回调。如果将异步任务更改为,然后将doInBackground返回类型更改为Object,将onPostExecute参数更改为Object,则可以将对象传递给Callback.go方法并返回该值。