0

XMLファイルを解析するHTTPリクエストがあります。asyntaskからインターネットに接続しようとしていますが、できませんでした

私はこれを行い、コードをスレッド内に配置することで機能しますが、AsycTask内には配置しません。私が抱えている問題は、HTTPリクエストが次のコード行を含む文字列内で呼び出されることです。

String xml = parser.getXmlFromUrl(URL);

これを実行する

public String getXmlFromUrl(String url) {
            Thread t= new Thread(){
                public void run() {
                    xml = null;              
                    try {
                        Log.i("Log1","Parse");
                        // defaultHttpClient
                        DefaultHttpClient httpClient = new DefaultHttpClient();
                        HttpPost httpPost = new HttpPost("http://api.androidhive.info/music/music.xml");

                        HttpResponse httpResponse = httpClient.execute(httpPost);
                        HttpEntity httpEntity = httpResponse.getEntity();
                        xml = EntityUtils.toString(httpEntity);

                    } catch (UnsupportedEncodingException e) {
                        e.printStackTrace();
                    } catch (ClientProtocolException e) {
                        e.printStackTrace();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    mHandler.post(mUpdateResults);
                }
            };
            t.start();
            return xml;
        }

        final Runnable mUpdateResults =new Runnable (){
            public void run(){//2

            }
        };

前述したように、HTTPリクエストはスレッド内にありますが、AsycTask内に配置しようとすると、常にエラーが発生します...その方法がわかりません。

AsycTaskのドキュメントを参照して何度も読んだり、チュートリアルを検索したりしましたが、正しくビルドできませんでした。

2日後、私は少し必死になり始めます

私は自分の仕事の完全なコードを入れました。誰かがAsyncTaskスレッドを置き換える方法を教えてくれれば、私は非常に感謝します。

どうもありがとうございました

完全な活動:

public class PruebasActivity extends Activity {


    static final String URL = "http://api.androidhive.info/music/music.xml";
    // XML node keys
        static final String KEY_SONG = "song"; // parent node
        static final String KEY_ID = "id";
        static final String KEY_TITLE = "title";
        static final String KEY_ARTIST = "artist";
        static final String KEY_DURATION = "duration";
        static final String KEY_THUMB_URL = "thumb_url";

        private ArrayList<HashMap<String, String>> data;
        ArrayList<HashMap<String, String>> songsList;

        ListView list;
        LazyAdapter adapter;
        String xml;

        final Handler mHandler=new Handler();


        // constructor
        public void XMLParser() {

        }

        /**
         * Cogiendo el XML de la URL mediante HTTP request
         * @param url string
         * */
        public String getXmlFromUrl(String url) {
            Thread t= new Thread(){
                public void run() {
                    xml = null;              
                    try {
                        Log.i("Log1","Parse");
                        // defaultHttpClient
                        DefaultHttpClient httpClient = new DefaultHttpClient();
                        HttpPost httpPost = new HttpPost("http://api.androidhive.info/music/music.xml");

                        HttpResponse httpResponse = httpClient.execute(httpPost);
                        HttpEntity httpEntity = httpResponse.getEntity();
                        xml = EntityUtils.toString(httpEntity);

                    } catch (UnsupportedEncodingException e) {
                        e.printStackTrace();
                    } catch (ClientProtocolException e) {
                        e.printStackTrace();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    mHandler.post(mUpdateResults);
                }
            };
            t.start();
            return xml;
        }

        final Runnable mUpdateResults =new Runnable (){
            public void run(){//2

            }
        };

        /*
         * @param XML string
         * */
        public Document getDomElement(String xml){
            Document doc = null;
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            try {

                DocumentBuilder db = dbf.newDocumentBuilder();

                InputSource is = new InputSource();
                is.setCharacterStream(new StringReader(xml));
                doc = db.parse(is); 

            } catch (ParserConfigurationException e) {
                Log.e("Error: ", e.getMessage());
                return null;
            } catch (SAXException e) {
                Log.e("Error: ", e.getMessage());
                return null;
            } catch (IOException e) {
                Log.e("Error: ", e.getMessage());
                return null;
            }

            return doc;
        }

        /*
         * @param elem element
         */
        public final String getElementValue( Node elem ) {
            Node child;
            if( elem != null){
                if (elem.hasChildNodes()){
                    for( child = elem.getFirstChild(); child != null; child = child.getNextSibling() ){
                        if( child.getNodeType() == Node.TEXT_NODE  ){
                            return child.getNodeValue();
                        }
                    }
                }
            }
            return "";
        }

        /*
         * @param Element node
         * @param key string
         * */
        public String getValue(Element item, String str) {      
            NodeList n = item.getElementsByTagName(str);        
            return this.getElementValue(n.item(0));
        }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        list=(ListView)findViewById(R.id.list);

        songsList = new ArrayList<HashMap<String, String>>();

        XMLParser parser = new XMLParser();
        String xml = parser.getXmlFromUrl(URL); // Cogiendo XML de la URL
        Document doc = parser.getDomElement(xml); // Cogiendo DOM de los elementos

        NodeList nl = doc.getElementsByTagName(KEY_SONG);
        // looping through all song nodes <song>
        for (int i = 0; i < nl.getLength(); i++) {
            // creating new HashMap
            HashMap<String, String> map = new HashMap<String, String>();
            Element e = (Element) nl.item(i);
            // adding each child node to HashMap key => value
            map.put(KEY_ID, parser.getValue(e, KEY_ID));
            map.put(KEY_TITLE, parser.getValue(e, KEY_TITLE));
            map.put(KEY_ARTIST, parser.getValue(e, KEY_ARTIST));
            map.put(KEY_DURATION, parser.getValue(e, KEY_DURATION));
            map.put(KEY_THUMB_URL, parser.getValue(e, KEY_THUMB_URL));          

            // adding HashList to ArrayList
            songsList.add(map);
        }

        // Pasando datos parseados del adaptador al arrayList
        adapter=new MinAdapter(this, songsList);        
        list.setAdapter(adapter);   
    }
}
4

2 に答える 2

0

HTTPリクエストはAsynctaskのdoInBackground関数で実行でき、実行可能な関数はonPostExecute関数です。結果はこれです:

public class XmlTask extends AsyncTask<String, Void, String>{

    public String doInBackground(String... urls){
        String url = urls[0];

        // Place your getXmlFromUrl content here

        return xml;
    }

    public void onPostExecute(String xml){
        // Your XML parsing staement here
    }
}

このコードでは、スレッドとランナブルは不要です。

そして、あなたのアクティビティでタップするだけです:

new XmlTask().execute("http://yoururl");
于 2012-07-10T17:45:25.060 に答える
0

次のコードが機能するはずです。それを試してみてください:

public class PruebasActivity extends Activity {

static final String URL = "http://api.androidhive.info/music/music.xml";
// XML node keys
    static final String KEY_SONG = "song"; // parent node
    static final String KEY_ID = "id";
    static final String KEY_TITLE = "title";
    static final String KEY_ARTIST = "artist";
    static final String KEY_DURATION = "duration";
    static final String KEY_THUMB_URL = "thumb_url";

    private ArrayList<HashMap<String, String>> data;
    ArrayList<HashMap<String, String>> songsList;

    ListView list;
    LazyAdapter adapter;
    String xml;

    // constructor
    public void XMLParser() {

    }

    /**
     * Cogiendo el XML de la URL mediante HTTP request
     * @param url string
     * */
    public String getXmlFromUrl(String url) {
            xml = null;              
            try {
                Log.i("Log1","Parse");
                // defaultHttpClient
                DefaultHttpClient httpClient = new DefaultHttpClient();
                HttpPost httpPost = new HttpPost("http://api.androidhive.info/music/music.xml");

                HttpResponse httpResponse = httpClient.execute(httpPost);
                HttpEntity httpEntity = httpResponse.getEntity();
                xml = EntityUtils.toString(httpEntity);

            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            } catch (ClientProtocolException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }

        return xml;
    }


    /*
     * @param XML string
     * */
    public Document getDomElement(String xml){
        Document doc = null;
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        try {

            DocumentBuilder db = dbf.newDocumentBuilder();

            InputSource is = new InputSource();
            is.setCharacterStream(new StringReader(xml));
            doc = db.parse(is); 

        } catch (ParserConfigurationException e) {
            Log.e("Error: ", e.getMessage());
            return null;
        } catch (SAXException e) {
            Log.e("Error: ", e.getMessage());
            return null;
        } catch (IOException e) {
            Log.e("Error: ", e.getMessage());
            return null;
        }

        return doc;
    }

    /*
     * @param elem element
     */
    public final String getElementValue( Node elem ) {
        Node child;
        if( elem != null){
            if (elem.hasChildNodes()){
                for( child = elem.getFirstChild(); child != null; child = child.getNextSibling() ){
                    if( child.getNodeType() == Node.TEXT_NODE  ){
                        return child.getNodeValue();
                    }
                }
            }
        }
        return "";
    }

    /*
     * @param Element node
     * @param key string
     * */
    public String getValue(Element item, String str) {     
        NodeList n = item.getElementsByTagName(str);        
        return this.getElementValue(n.item(0));
    }

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    list=(ListView)findViewById(R.id.list);

    AsyncTask<Void, Void, Void> ast = new AsyncTask<Void, Void, Void>(){
        ProgressDialog p;
        @Override
        protected void onPreExecute() {
            // TODO Auto-generated method stub
             p = new ProgressDialog(EditTextDemoActivity.this);
            //write code to start the progress dialog
        }

        @Override
        protected Void doInBackground(Void... params) {
            // TODO Auto-generated method stub
            songsList = new ArrayList<HashMap<String, String>>();

            XMLParser parser = new XMLParser();
            String xml = parser.getXmlFromUrl(URL); // Cogiendo XML de la URL
            Document doc = parser.getDomElement(xml); // Cogiendo DOM de los elementos

            NodeList nl = doc.getElementsByTagName(KEY_SONG);
            // looping through all song nodes <song>
            for (int i = 0; i < nl.getLength(); i++) {
                // creating new HashMap
                HashMap<String, String> map = new HashMap<String, String>();
                Element e = (Element) nl.item(i);
                // adding each child node to HashMap key => value
                map.put(KEY_ID, parser.getValue(e, KEY_ID));
                map.put(KEY_TITLE, parser.getValue(e, KEY_TITLE));
                map.put(KEY_ARTIST, parser.getValue(e, KEY_ARTIST));
                map.put(KEY_DURATION, parser.getValue(e, KEY_DURATION));
                map.put(KEY_THUMB_URL, parser.getValue(e, KEY_THUMB_URL));          

                // adding HashList to ArrayList
                songsList.add(map);
            }
        }


        @Override
        protected void onPostExecute(Void result) {
            // TODO Auto-generated method stub
            p.dismiss();
            adapter=new MinAdapter(this, songsList);        
            lst.setAdapter(adapter); 
        }
    };

    ast.execute();
}
}

を使用してコードを実装しましたAsyncTaskThreadを使用している場合、バックグラウンドアクティビティを実装するために他に必要なものはありませんAsyncTask。演習として、コーディングのごく一部(進行状況ダイアログを作成して表示するため)を残しました。

お役に立てれば。

于 2012-07-10T18:13:08.463 に答える