2013-10-04 3 views
0

여러 도시의 날씨를 업데이트하는 응용 프로그램을 만들려고합니다. 각 행에 다른 온도가 있으므로 AsynkTask를 사용해야합니다. 하지만 API에서 응답을 얻은 후 UI를 업데이트 할 수 없습니다.Asynk 작업에서 값을 제공하지 않는 루프를 호출하는 중

내 주요 활동

public class MainActivity extends Activity { 
    LinearLayout depart_arrivals_details; 
    LayoutInflater inflater; 
    TextView depart_time, 
    depart_airport_city, depart_airport, arrival_time, 
    arrival_airport_city, arrival_airport, pnr_number,temprature,humidity; 
    ImageView flight_depart_image; 
    public static String url = ""; 
    WeatherResponse response; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     depart_arrivals_details = (LinearLayout) findViewById(R.id.depart_arrivals_details); 
     inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     setSectorData(); 
    } 

    void setSectorData() { 
     for (int i = 0; i < 1; i++) { 
      inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      RelativeLayout layout = (RelativeLayout) inflater.inflate(
        R.layout.sector_details, depart_arrivals_details, false); 
      depart_time = (TextView)layout.findViewById(R.id.depart_time); 
      depart_airport_city = (TextView)layout.findViewById(R.id.depart_airport_city); 
      temprature = (TextView)layout.findViewById(R.id.temprature); 
      humidity = (TextView)layout.findViewById(R.id.humidity); 
      flight_depart_image = (ImageView)layout.findViewById(R.id.flight_depart_image); 
      WeatherResponse responseUpdate = requestWeatherUpdate("DEL"); 

     depart_time.setText("20:45"); 
     depart_airport_city.setText("Mumbai"); 
     /* 
     * This part will be updated when we will se the request and get the response 
     * then we have to set the temp and humidity for each city that we have recived 
     * */ 
     temprature.setText(responseUpdate.getTempInC()+(char) 0x00B0);//Here it is showing null pointer exception after that the respone is coming from the server .So can we do this 
     humidity.setText(responseUpdate.getHumidity()); 

      flight_depart_image.setImageResource(R.drawable.f1); 

      depart_arrivals_details.addView(layout, i); 
     } 
    } 

    /* 
    * Here the location will be dynamic and have to send the request for all the location i have 
    * */ 
    private WeatherResponse requestWeatherUpdate(String location) { 
     url = "http://api.worldweatheronline.com/free/v1/weather.ashx?&format=xml&num_of_days=2&key=uysakmq923nbd5y549yz3aaw&q=" 
       + location; 
     Log.d("URL for Weather Upadate", url); 
     WeatherUpdateAsyncTask weatherReq = new WeatherUpdateAsyncTask(new CallBack() { 
      @Override 
      public void run(Object result) { 
       try { 
        String AppResponse = (String) result; 
        response = ParseWeatherResponseXML 
          .parseMyTripXML(AppResponse); 
       } catch (Exception e) { 
        Log.e("TAG Exception Occured", 
          "Exception is " + e.getMessage()); 
       } 
      } 
     }); 
     weatherReq.execute(url); 
     return response; 

    } 

이 내 requestWeatherUpdate

private WeatherResponse requestWeatherUpdate(String location) { 
     url = "" 
       + location; 
     Log.d("URL for Weather Upadate", url); 
     WeatherUpdateAsyncTask weatherReq = new WeatherUpdateAsyncTask(new CallBack() { 
      @Override 
      public void run(Object result) { 
       try { 
        String AppResponse = (String) result; 
        response = ParseWeatherResponseXML 
          .parseMyTripXML(AppResponse); 
       } catch (Exception e) { 
        Log.e("TAG Exception Occured", 
          "Exception is " + e.getMessage()); 
       } 
      } 
     }); 
     weatherReq.execute(url); 
     return response; 

    } 

내가 내가 널 포인터 예외에게 당신이 할 수있는

답변

0

루프 대한

먼저 시도

depart_arrivals_details.removeAllViews(); 
for (int i = 0; i < 2; i++) { 
      requestWeatherUpdate("BLR"); 
      } 

기능은

AsynkTask

private WeatherResponse requestWeatherUpdate(String location) { 
     url = "" 
       + location; 
     Log.d("URL for Weather Upadate", url); 
     WeatherUpdateAsyncTask weatherReq = new WeatherUpdateAsyncTask(); 
     String weatherRequestResponse=""; 
     try { 
      weatherRequestResponse=weatherReq.execute(url).get(); 
      parsedWeatherResponse = ParseWeatherResponseXML 
        .parseMyTripXML(weatherRequestResponse); 
     } catch (InterruptedException e) { 

      e.printStackTrace(); 
     } catch (ExecutionException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (ParserConfigurationException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (SAXException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     return parsedWeatherResponse; 

    } 

그리고 을 WeatherResponse

public class WeatherUpdateAsyncTask extends AsyncTask<String, Void, String> { Context context; CallBack callBack; @Override protected String doInBackground(String... arg0) { String responseString = ""; HttpClient client = null; try { client = new DefaultHttpClient(); HttpGet get = new HttpGet(arg0[0]); client.getParams().setParameter("http.socket.timeout", 6000); client.getParams().setParameter("http.connection.timeout", 6000); HttpResponse responseGet = client.execute(get); HttpEntity resEntityGet = responseGet.getEntity(); if (resEntityGet != null) { responseString = EntityUtils.toString(resEntityGet); Log.i("GET RESPONSE", responseString.trim()); } } catch (Exception e) { Log.d("ANDRO_ASYNC_ERROR", "Error is " + e.toString()); } Log.d("ANDRO_ASYNC_RESPONSE", responseString.trim()); client.getConnectionManager().shutdown(); return responseString.trim(); } @Override protected void onPostExecute(String result) { super.onPostExecute(result); } } 
+0

이 값을 사용하여 설정합니다. temprature.setText (parsedWeatherResponse.getTempInC() + (char) 0x00B0); – Developer

0

을 던지고 받았다 한 값을 설정하려고하면를 사용하여 결과를 얻은 후 Thread UI에서 실행되는 Views을 업데이트하십시오.님의 onPostExecute() 또한 AsyncTaskexecute()으로 전화하여 AsyncTask을 실제로 시작해야합니다.

+0

이렇게 할 수 있습니다. 당신을 얻지 못하고 있습니다. 더 자세히 설명해주세요. 안드로이드에서 새로운 것입니다. –

+0

Emmanuel은 requestWeatherUpdate 메소드에서 weatherReq.execute()를 호출해야한다는 것을 의미합니다. 또한 사용자 인터페이스를 업데이트하려면 작업에서 onPostExecute()를 재정의해야합니다. – Axarydax

+0

첫 번째'requestWeatherUpdate (String location)'에서 당신은'execute()'를 호출하지만, 두 번째에서는 그렇지 않습니다. 'onPostExecute()'는'Thread' UI에 있습니다. 즉,'doInBackgroind()'에서 얻은 결과 문자열을 반환하고 weatherReq를 요청한 requestWeatherUpdate에서'onPostExecute()'에 – Emmanuel