[英]Android thread error - Can't create handler inside thread that has not called Looper.prepare()
[英]Can't create handler inside thread that has not called Looper.prepare() Android
我正在使用AsyncTask來調用yahooweather API。 以下是代碼:
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()
請幫幫我。
從QueryYahooWeather
方法中刪除所有Toast,因為此方法是從AsyncTask
doInBackground(Object... params)
調用的,並且您無法從后台Thread訪問Uast元素,如Toast(也是一個Ui元素)。
注意:如果你想知道背景中發生了什么,那么使用Log而不是Toast
編輯:
將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;
}
你在打電話
Toast.makeText(getBaseContext(), e.toString(), Toast.LENGTH_LONG)
.show();
在QueryYahooWeather
,在QueryYahooWeather
中doInBackground
。
您無法從后台線程調用UI
調用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.