2012-10-28 26 views
0

我有這樣的代碼。 這是創建如何使用weather API和Location Manager togethaer?

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。

回答

1

您需要在單獨的線程中執行您的網絡操作(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(); 
} 
+0

但如何將經度和緯度傳遞給異步任務? – Shreesha

+0

是的,你說的是正確的。但我怎麼能從onLocationChanged返回一個數組,它不支持返回值。 – Shreesha

+0

使用回調。如果將異步任務更改爲,然後將doInBackground返回類型更改爲Object,並將onPostExecute參數更改爲Object,則可以將Object傳遞給Callback.go方法並返回該值。 – Phil

0

你需要使用的AsyncTask從蜂巢你不能在你的主線程(進程)使用網絡過程中,搜索異步任務

相關問題