2013-09-24 58 views
0

我有這樣的代碼:我需要一些幫助等待的線程結束

jsonObject1=getLocationInfo(direction); 

它的目的是返回一個JSONObject,以後將被解析,我會得到lattitude和經度。

這是方法:

public JSONObject getLocationInfo(final String address) { 

      Thread thread=new Thread(){ 

       public void run(){ 
        String adressString=address.replaceAll("\\s+",","); 
        StringBuilder stringBuilder = new StringBuilder(); 

        try { 



        HttpPost httppost = new HttpPost("http://maps.google.com/maps/api/geocode/json?address=" + adressString + "&sensor=false"); 
        HttpClient client = new DefaultHttpClient(); 
        HttpResponse response; 
        stringBuilder = new StringBuilder(); 


         response = client.execute(httppost); 
         HttpEntity entity = response.getEntity(); 
         InputStream stream = entity.getContent(); 
         int b; 
         while ((b = stream.read()) != -1) { 
          stringBuilder.append((char) b); 
         } 

        } catch (ClientProtocolException e) { 
        } catch (IOException e) { 
        } 

        ; 
        try { 
         jsonObject = new JSONObject(stringBuilder.toString()); 
        } catch (JSONException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } 



       } 
      }; 
      thread.start(); 

      return jsonObject; 
     } 

問題是...因爲這方法涉及HTTPGET,它必須在另一個線程。但是,在thread.start()方法之後,返回的jsonObject行被調用,所以返回的對象將爲空......我怎麼能等待線程在返回之前結束?

謝謝。

+1

使用asynctask它更容易編碼。 – Raghunandan

+0

如果您在開始/等待某個線程後不做任何操作,則不需要/不應該使用線程。你不會得到'NetworkOnMainThreadException',因爲你隱藏了阻止http的主線程的事實,但你基本上是在主線程中執行它,因爲只要另一個線程執行http,它就會等待。 – zapl

回答

0

使用AsyncTask,所有網絡的東西是在doInBackground完成,之後即大功告成onPostExecute被調用,讓你知道當HTTPGET已完成,你需要做的還有

+0

我的課程擴展服務,所以我不能擴展AsyncTask – Fustigador

+0

你創建AsyncTask作爲你的服務中的內部類 – tyczj

+0

我會尋找一些關於這個的例子... – Fustigador

0

很少有什麼方法如何做到這一點。但是,如果您只是想使用上面的線程,請使用Handler並通過Handlers發送數據。讓我知道您是否想要查看一些代碼。