1

サーバーから XML ファイルをダウンロードしようとしており、XMLpull パーシャーを使用して処理していますが、データ全体を毎回ダウンロードするわけではありません。ダウンロードするのを待ってみても(スレッドスリープ)。なぜこれが起こるのか、または問題を解決する方法を知っていますか? これはファイルをダウンロードする私の機能です

    /*XML read*/
private String downloadUrl(String myurl) throws IOException {
    InputStream is = null;
    int len = 100000;

    try {
        URL url_get = new URL(myurl);
        HttpURLConnection conn = (HttpURLConnection) url_get.openConnection();

        conn.setReadTimeout(15000 /* milliseconds */);
        conn.setConnectTimeout(15000 /* milliseconds */);

        conn.setRequestMethod("GET");
        conn.setDoInput(true);
        // Starts the query
        conn.connect();
        is = conn.getInputStream();
        String contentAsString = readIt(is, len);  
        return contentAsString;

    // Makes sure that the InputStream is closed after the app is
    // finished using it.
    } finally {
        if (is != null) {
            is.close();
        } 
    }
}

public String readIt(InputStream stream, int len) throws IOException, UnsupportedEncodingException {

    Reader reader = null;

    reader = new InputStreamReader(stream, "UTF-8");        
    char[] buffer = new char[len];
    reader.read(buffer);


    return new String(buffer);

}

もちろん、スレッドを使用して関数を開始しています。

スレッドは次のとおりです。

Thread thread =  new Thread(new Runnable() { 
        public void run() {

            try {
                Thread.sleep(100);

            while (while_start)
            {
                if(While_getadat){



                try {


                get_xml = downloadUrl(URL_IMEI);
                Thread.sleep(2000); 

                Global_XML_data=red_xml(get_xml);
                Thread.sleep(1000);
                While_getadat=false;

                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

                                }

            }
                }

                            }

アップデート

デバッグモードでプログラムが適切に動作するという興味深いこと 私はすべてのデータを取得しました

4

1 に答える 1

0

スレッドを手動で開始する代わりに、AsyncTask の使用を検討しますか? URLへのPOST(質問のGETと比較)の実際の例を次に示します。

/**
 * Call a RESTful API to post a json
 * @param url
 * @param jsonObject
 */
private void postJson(URL url, JSONObject jsonObject) {
    HttpURLConnection conn = null;
    try {
        conn = (HttpURLConnection) url.openConnection();
        conn.setRequestProperty("Content-Type", "application/json");
        conn.setDoOutput(true);
        conn.setChunkedStreamingMode(0);
        conn.setUseCaches(false);

        OutputStream out = new BufferedOutputStream(conn.getOutputStream());
        String jsonString = jsonObject.toString();
        Log.i("ArtistRegistrationActivity", "Sending " + jsonString + " to " + conn.getURL().toString());
        out.write(jsonString.getBytes());
        out.flush();
        out.close();
    } catch (IOException e) {
        Log.e("ArtistRegistrationActivity", e.toString());
    } finally {
        conn.disconnect();
    }
}

/**
 * Call postJson in a separate thread.  Takes a URL and a JSONObject as param
 */
private class PostJsonTask extends AsyncTask<Object, Void, Void> {
    @Override
    protected Void doInBackground(Object... urlAndJson) {
        // params[0] is the url, params[1] is the Json to sent.
        URL url = (URL) urlAndJson[0];
        JSONObject json = (JSONObject) urlAndJson[1];
        postJson(url, json);
        return null;
    }

}
于 2013-07-21T21:23:57.490 に答える