1

AsyncTaskを使用してyahooweatherAPIを呼び出しています。コードは次のとおりです。


public class myactivity extends Activity {
    final String yahooapisBase = "http://query.yahooapis.com/v1/public/yql?q=select*from%20geo.places%20where%20text=";
    final String yahooapisFormat = "&format=xml";
    String yahooAPIsQuery;

EditText input_city; EditText input_zip; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.myactivity); Button btn_findout = (Button) findViewById(R.id.btn_findout); input_city = (EditText) findViewById(R.id.input_cityOrcountry); input_zip = (EditText) findViewById(R.id.input_zip); // when Zip textbox has focus input_zip.setOnFocusChangeListener(new View.OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { if (hasFocus) { String string = ""; input_city.setText(string); } } }); // when city/country textbox has focus input_city.setOnFocusChangeListener(new View.OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { if (hasFocus) { String string = ""; input_zip.setText(string); } } }); // when findout button is clicked btn_findout.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { // Perform action on click String uriPlace = Uri.encode(input_city.getText().toString()); yahooAPIsQuery = yahooapisBase + "%22" + uriPlace + "%22" + yahooapisFormat; Toast.makeText(getBaseContext(), "Before entering into sub thread", Toast.LENGTH_LONG) .show(); new WeatherAPITask().execute(yahooAPIsQuery); Toast.makeText(getBaseContext(), "After sub thread", Toast.LENGTH_LONG).show(); Log.i("my label", "back in main thread..."); // String woeidString = QueryYahooWeather(yahooAPIsQuery); // input_city.setText(woeidString); } }); } private String QueryYahooWeather(String queryString) { String qResult = ""; HttpClient httpClient = new DefaultHttpClient(); HttpGet httpGet = new HttpGet(queryString); try { Log.i("WeatherApp", "digging into try block..."); Log.i("queryString", queryString); HttpEntity httpEntity = httpClient.execute(httpGet).getEntity(); if (httpEntity != null) { InputStream inputStream = httpEntity.getContent(); Reader in = new InputStreamReader(inputStream); BufferedReader bufferedreader = new BufferedReader(in); StringBuilder stringBuilder = new StringBuilder(); String stringReadLine = null; while ((stringReadLine = bufferedreader.readLine()) != null) { stringBuilder.append(stringReadLine + "\n"); } qResult = stringBuilder.toString(); } } catch (ClientProtocolException e) { e.printStackTrace(); Toast.makeText(getBaseContext(), e.toString(), Toast.LENGTH_LONG) .show(); } catch (IOException e) { e.printStackTrace(); Toast.makeText(getBaseContext(), e.toString(), Toast.LENGTH_LONG) .show(); } catch (Exception e) { e.printStackTrace(); Toast.makeText(getBaseContext(), e.toString(), Toast.LENGTH_LONG) .show(); } Toast.makeText(getBaseContext(), "Returning from function", Toast.LENGTH_LONG).show(); return qResult; } private class WeatherAPITask extends AsyncTask { protected void onPostExecute(String result) { Log.i("my label", "entering in onPostExecute"); Log.i("result", result); input_city.setText("result"); } @Override protected Object doInBackground(Object... params) { // TODO Auto-generated method stub try { Log.i("my label", "entering in doInBackground"); Log.i("params[0]", params[0].toString()); return QueryYahooWeather(params[0].toString()); } catch (Exception e) { Log.i("my label", e.toString()); return null; } } }

}

コードをデバッグした後、yahooAPI呼び出しが成功し、QueryYahooWeather関数内のXML応答を確認できることがわかりました。ただし、この関数の実行が完了するとすぐに、例外がスローされます。 Can't create handler inside thread that has not called Looper.prepare()

私を助けてください。

4

2 に答える 2

2

QueryYahooWeatherこのメソッドはdoInBackground(Object... params)ofから呼び出されAsyncTask、バックグラウンドスレッドからToast(これもUi要素)のようなUi要素にアクセスできないため、すべてのToastをfromメソッドから削除します。

注:バックグラウンドで何が起こっているのかを知りたい場合は、Toastの代わりにLogを使用してください

編集:

doInBackgroundを次のように変更します。

@Override
protected String doInBackground(Object... params) {
    // TODO Auto-generated method stub
    String strresult="";
    try {
        Log.i("my label", "entering in doInBackground");
        Log.i("params[0]", params[0].toString());
         strresult= QueryYahooWeather(params[0].toString());
         Log.i("strresult result ::: ", strresult);

    } catch (Exception e) {
        Log.i("my label", e.toString());
        return null;
    }
 return strresult;
}
于 2012-12-02T09:21:09.747 に答える
1

あなたが呼んでいる

Toast.makeText(getBaseContext(), e.toString(), Toast.LENGTH_LONG)
            .show();

QueryYahooWeather呼び出されていdoInBackgroundます。

UIバックグラウンドスレッドから呼び出しを呼び出すことはできません。

于 2012-12-02T09:21:19.720 に答える