Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在android中从城市名称中检索WOEID?_Android_Xml Parsing_Yahoo Weather Api - Fatal编程技术网

如何在android中从城市名称中检索WOEID?

如何在android中从城市名称中检索WOEID?,android,xml-parsing,yahoo-weather-api,Android,Xml Parsing,Yahoo Weather Api,我做了一个简单的android演示,我放了一个editText和一个按钮,我想要的是当一个人输入anky城市名称和点击搜索按钮时。应该列出一个相关的WOEID列表,我尝试了以下方法,但不起作用,它给了我一个例外,我的代码如下: search.java public class SesachActivity extends Activity { final String yahooapisBase = "http://query.yahooapis.com/v1/public/yql?q=

我做了一个简单的android演示,我放了一个editText和一个按钮,我想要的是当一个人输入anky城市名称和点击搜索按钮时。应该列出一个相关的WOEID列表,我尝试了以下方法,但不起作用,它给了我一个例外,我的代码如下:

search.java

public class SesachActivity 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 place;
    Button search;
    ListView listviewWOEID;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sesach);
        place = (EditText) findViewById(R.id.place);
        search = (Button) findViewById(R.id.search);
        listviewWOEID = (ListView) findViewById(R.id.woeidlist);

        search.setOnClickListener(searchOnClickListener);
    }

    Button.OnClickListener searchOnClickListener = new Button.OnClickListener() {

        @Override
        public void onClick(View arg0) {
            if (place.getText().toString().equals("")) {
                Toast.makeText(getBaseContext(), "Enter place!",
                        Toast.LENGTH_LONG).show();
            } else {
                ArrayList<String> l = QueryYahooAPIs();

                ArrayAdapter<String> aa = new ArrayAdapter<String>(
                        getBaseContext(), android.R.layout.simple_list_item_1,
                        l);

                listviewWOEID.setAdapter(aa);
            }
        }

    };

    private ArrayList<String> QueryYahooAPIs() {

        String uriPlace = Uri.encode(place.getText().toString());

        yahooAPIsQuery = yahooapisBase + "%22" + uriPlace + "%22"
                + yahooapisFormat;

        String woeidString = QueryYahooWeather(yahooAPIsQuery);
        Document woeidDoc = convertStringToDocument(woeidString);
        /*System.out.println(":::::::::::WOEID DOC::::::::::::"+woeid);*/
        return parseWOEID(woeidDoc);

    }

    private ArrayList<String> parseWOEID(Document srcDoc) {

        ArrayList<String> listWOEID = new ArrayList<String>();

        NodeList nodeListDescription = srcDoc.getElementsByTagName("woeid");
        if (nodeListDescription.getLength() >= 0) {
            for (int i = 0; i < nodeListDescription.getLength(); i++) {
                listWOEID.add(nodeListDescription.item(i).getTextContent());
            }
        } else {
            listWOEID.clear();
        }

        return listWOEID;
    }

    private Document convertStringToDocument(String src) {
        Document dest = null;

        DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder parser;

        try {
            parser = dbFactory.newDocumentBuilder();
            dest = parser.parse(new ByteArrayInputStream(src.getBytes()));
        } catch (ParserConfigurationException e1) {
            e1.printStackTrace();
            Toast.makeText(getBaseContext(), e1.toString(), Toast.LENGTH_LONG)
                    .show();
        } catch (SAXException 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();
        }

        return dest;

    }

    private String QueryYahooWeather(String queryString) {

        String qResult = "";

        HttpClient httpClient = new DefaultHttpClient();

        // return Uri.encode(queryString);

        HttpGet httpGet = new HttpGet(queryString);

        try {
            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();
        }

        return qResult;

    }

}

请帮我解决,提前谢谢你

您正在主线程上调用HTTP连接。你不应该这样做,因为如果连接延迟,你的应用程序可能会处于ANR状态,并被操作系统终止。 您应该在另一个线程中移动Http连接,例如,您可以创建一个扩展AsyncTask的类,并在doBackground中实现您的逻辑。 希望这能帮助你


附言:在我的博客里,我举了一个例子,告诉你怎么做。如果您有兴趣,请看一看

也许您想与我们分享这个例外情况?@Ascorbin,等等……我是。附上我的logcat跟踪……只要在谷歌上搜索该例外情况就可以解决您的问题:
01-02 07:00:34.624: E/AndroidRuntime(1792): FATAL EXCEPTION: main
01-02 07:00:34.624: E/AndroidRuntime(1792): android.os.NetworkOnMainThreadException
01-02 07:00:34.624: E/AndroidRuntime(1792):     at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1133)
01-02 07:00:34.624: E/AndroidRuntime(1792):     at java.net.InetAddress.lookupHostByName(InetAddress.java:385)
01-02 07:00:34.624: E/AndroidRuntime(1792):     at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)
01-02 07:00:34.624: E/AndroidRuntime(1792):     at java.net.InetAddress.getAllByName(InetAddress.java:214)
01-02 07:00:34.624: E/AndroidRuntime(1792):     at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:137)
01-02 07:00:34.624: E/AndroidRuntime(1792):     at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
01-02 07:00:34.624: E/AndroidRuntime(1792):     at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
01-02 07:00:34.624: E/AndroidRuntime(1792):     at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
01-02 07:00:34.624: E/AndroidRuntime(1792):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
01-02 07:00:34.624: E/AndroidRuntime(1792):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
01-02 07:00:34.624: E/AndroidRuntime(1792):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
01-02 07:00:34.624: E/AndroidRuntime(1792):     at com.example.dayweather.SesachActivity.QueryYahooWeather(SesachActivity.java:144)
01-02 07:00:34.624: E/AndroidRuntime(1792):     at com.example.dayweather.SesachActivity.QueryYahooAPIs(SesachActivity.java:81)
01-02 07:00:34.624: E/AndroidRuntime(1792):     at com.example.dayweather.SesachActivity.access$0(SesachActivity.java:74)
01-02 07:00:34.624: E/AndroidRuntime(1792):     at com.example.dayweather.SesachActivity$1.onClick(SesachActivity.java:62)
01-02 07:00:34.624: E/AndroidRuntime(1792):     at android.view.View.performClick(View.java:4240)
01-02 07:00:34.624: E/AndroidRuntime(1792):     at android.view.View$PerformClick.run(View.java:17721)
01-02 07:00:34.624: E/AndroidRuntime(1792):     at android.os.Handler.handleCallback(Handler.java:730)
01-02 07:00:34.624: E/AndroidRuntime(1792):     at android.os.Handler.dispatchMessage(Handler.java:92)
01-02 07:00:34.624: E/AndroidRuntime(1792):     at android.os.Looper.loop(Looper.java:137)
01-02 07:00:34.624: E/AndroidRuntime(1792):     at android.app.ActivityThread.main(ActivityThread.java:5103)
01-02 07:00:34.624: E/AndroidRuntime(1792):     at java.lang.reflect.Method.invokeNative(Native Method)
01-02 07:00:34.624: E/AndroidRuntime(1792):     at java.lang.reflect.Method.invoke(Method.java:525)
01-02 07:00:34.624: E/AndroidRuntime(1792):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
01-02 07:00:34.624: E/AndroidRuntime(1792):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
01-02 07:00:34.624: E/AndroidRuntime(1792):     at dalvik.system.NativeStart.main(Native Method)