Search code examples
androidgpslocationmanager

How to use weather API and Location Manager togethaer?


i have code like this. this is on create

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

this is location listener class

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

        }



    }

this is json wrapper function

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

}

if i pass location through the DDMS it gives error like NetworkOnMainThread Exception. please help me i stuck b/w location and json.


Solution

  • You need to do your network operation (HTTPGet) in a separate Thread. Using an Async Task works best.

    EDIT:

    For example, add this inner class:

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