如何一起使用天气API和位置管理器?

时间:2012-10-28 16:08:08

标签: android gps locationmanager

我有这样的代码。 这是在创建

 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。

2 个答案:

答案 0 :(得分:0)

您需要在单独的线程中进行网络操作(HTTPGet)。使用Async Task效果最佳。

修改

例如,添加此内部类:

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();
}

答案 1 :(得分:0)

你需要使用AsyncTask,因为你不能在主线程(进程)中使用网络进程,搜索异步任务