通过AsyncTask中的URL从服务器获取XML并返回对UI的响应

时间:2015-03-30 14:11:08

标签: java android android-asynctask

我尝试在异步任务中从服务器获取xml,但我的doInBackground方法返回NULL。我的错误在哪里?以及如何将结果发送到UI?

Here is all classes

我有从服务器获取xml的代码:

package classes;

import android.os.AsyncTask;
import android.util.Log;
import org.apache.http.HttpResponse;
import org.apache.http.StatusLine;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URISyntaxException;
import java.net.URL;

/**
 * Created by Mikhail on 28.03.2015.
 */
public class GetXMLFromServer {

    InputStreamReader reader;

    public GetXMLFromServer(){
        //reader = null;
    }

    public InputStreamReader getReaderWithXML(String url){

        GetXMlTask task = new GetXMlTask();
        task.execute(url);

        return reader;
    }

    public void setReader(InputStreamReader newReader){
        this.reader = newReader;
    }


    class GetXMlTask extends AsyncTask<String, Integer, InputStreamReader>{


        @Override
        protected InputStreamReader doInBackground(String... params) {
            InputStreamReader iStream = null;
            try {
                iStream = new InputStreamReader(getUrlData(params[0]));
            } catch (URISyntaxException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return iStream;
        }

        @Override
        protected void onPostExecute(InputStreamReader inputStreamReader) {
            super.onPostExecute(inputStreamReader);
            setReader(inputStreamReader);
        }

        public InputStream getUrlData(String urlString) throws URISyntaxException, IOException {
            DefaultHttpClient client = new DefaultHttpClient();
            HttpGet method = new HttpGet(String.valueOf(new URL(urlString)));
            HttpResponse res = client.execute(method);
            StatusLine status = res.getStatusLine();
            if (status.getStatusCode() != 200) {
                Log.d("APP", "HTTP error.Invalid server status code: " + res.getStatusLine());
            }
            return res.getEntity().getContent();
        }
    }
}

1 个答案:

答案 0 :(得分:1)

您有一个很好的示例如何使用异步任务here。 请检查一下!

返回的是onPostExecute方法。

要将结果发送到UI使用OnPostExecute,请调用UI类的静态方法。

protected void onPostExecute(Long result) {
     YourUIFragmentORActivity.showResult(result);
     showDialog("Downloaded " + result + " bytes");
 }