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方法并返回该值。