如何在Android中从web下载文本?

如何在Android中从web下载文本?,android,android-studio,web,android-asynctask,Android,Android Studio,Web,Android Asynctask,我是Android的新手,知道的不多。我需要帮助来更改此代码-我想从网站下载一些文本 如果我使用代码: 新建DownloadTextTask().execute(“”) 它不会在TextView中显示下载的文本,但如果我重新打开应用程序,我可以看到文本。我认为这是因为它是异步的,并且下载文本有延迟 如何修复此问题,或者仅使用此代码: (我的意思是直接使用DownloadText()函数!我尝试时它不起作用!) 所有代码: public class MainActivity extends App

我是Android的新手,知道的不多。我需要帮助来更改此代码-我想从网站下载一些文本

如果我使用代码: 新建DownloadTextTask().execute(“”)

它不会在
TextView
中显示下载的文本,但如果我重新打开应用程序,我可以看到文本。我认为这是因为它是异步的,并且下载文本有延迟

如何修复此问题,或者仅使用此代码: (我的意思是直接使用
DownloadText()
函数!我尝试时它不起作用!)

所有代码:

public class MainActivity extends AppCompatActivity {
    public InputStream OpenHttpConnection(String urlString) throws IOException{
        InputStream in = null;
        int response = -1;
        URL url = new URL(urlString);
        URLConnection conn = url.openConnection();
        if (!(conn instanceof HttpURLConnection))
            throw new IOException("Not an HTTP connection");
        try{
            HttpURLConnection httpConn = (HttpURLConnection) conn;
            httpConn.setAllowUserInteraction(false);
            httpConn.setInstanceFollowRedirects(true);
            httpConn.setRequestMethod("GET");
            httpConn.connect();
            response = httpConn.getResponseCode();
            if (response == HttpURLConnection.HTTP_OK) {
                in = httpConn.getInputStream();
            }
        }
        catch (Exception ex)
        {
            Log.d("MainActivity", ex.getLocalizedMessage());
            throw new IOException("Error connecting");
        }
        return in;
    }

    public String DownloadText(String URL)
    {
        int BUFFER_SIZE = 2000;
        InputStream in = null;
        try {
            in = OpenHttpConnection(URL);
        } catch (IOException e) {
            Log.d("MainActivity", e.getLocalizedMessage());
            return "";
        }
        InputStreamReader isr = new InputStreamReader(in);
        int charRead;
        String str = "";
        char[] inputBuffer = new char[BUFFER_SIZE];
        try {
            while ((charRead = isr.read(inputBuffer))>0) {
//---convert the chars to a String---
                String readString =
                String.copyValueOf(inputBuffer, 0, charRead);
                str += readString;
                inputBuffer = new char[BUFFER_SIZE];
            }
            in.close();
        } catch (IOException e) {
            Log.d("MainActivity", e.getLocalizedMessage());
            return "";
        }
        return str;
    }

    private class DownloadTextTask extends  AsyncTask<String, Void, String> {

        protected String doInBackground(String... urls) {
            return DownloadText(urls[0]);
        }
        @Override
        protected void onPostExecute(String result) {
            Toast.makeText(getBaseContext(), result, Toast.LENGTH_LONG).show();

        }

    }

    public static class xmlClass
    {
        public static String xml ="";
    }



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

//new DownloadTextTask().execute("http://www.test.com/file.xml");

        TextView txt = (TextView)findViewById(R.id.textTest);
        txt.setText(DownloadText("http://www.test.com/file.xml"));

    }
}
public类MainActivity扩展了AppCompatActivity{
公共InputStream OpenHttpConnection(字符串urlString)引发IOException{
InputStream in=null;
int响应=-1;
URL=新URL(URL字符串);
URLConnection conn=url.openConnection();
if(!(HttpURLConnection的连接实例))
抛出新IOException(“非HTTP连接”);
试一试{
HttpURLConnection httpConn=(HttpURLConnection)conn;
httpConn.setAllowUserInteraction(假);
httpConn.setInstanceFollowRedirects(真);
httpConn.setRequestMethod(“GET”);
httpConn.connect();
response=httpConn.getResponseCode();
if(response==HttpURLConnection.HTTP\u OK){
in=httpConn.getInputStream();
}
}
捕获(例外情况除外)
{
Log.d(“MainActivity”,例如getLocalizedMessage());
抛出新IOException(“连接错误”);
}
返回;
}
公共字符串下载文本(字符串URL)
{
int BUFFER_SIZE=2000;
InputStream in=null;
试一试{
in=OpenHttpConnection(URL);
}捕获(IOE异常){
Log.d(“MainActivity”,例如getLocalizedMessage());
返回“”;
}
InputStreamReader isr=新的InputStreamReader(in);
int-charRead;
字符串str=“”;
char[]inputBuffer=新字符[BUFFER_SIZE];
试一试{
而((charRead=isr.read(inputBuffer))>0){
//---将字符转换为字符串---
字符串读取字符串=
String.copyValueOf(inputBuffer,0,charRead);
str+=readString;
inputBuffer=新字符[缓冲区大小];
}
in.close();
}捕获(IOE异常){
Log.d(“MainActivity”,例如getLocalizedMessage());
返回“”;
}
返回str;
}
私有类DownloadTextTask扩展了AsyncTask{
受保护的字符串doInBackground(字符串…URL){
返回下载文本(URL[0]);
}
@凌驾
受保护的void onPostExecute(字符串结果){
Toast.makeText(getBaseContext(),result,Toast.LENGTH_LONG.show();
}
}
公共静态类xmlClass
{
公共静态字符串xml=”“;
}
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//新建DownloadTextTask()。执行(“http://www.test.com/file.xml");
TextView txt=(TextView)findViewById(R.id.textTest);
txt.setText(下载文本(“http://www.test.com/file.xml"));
}
}

在代码中设置文本

 if (response == HttpURLConnection.HTTP_OK) {
        in = httpConn.getInputStream();
        txt.setText(Parse your response);
    }

在代码中设置文本

 if (response == HttpURLConnection.HTTP_OK) {
        in = httpConn.getInputStream();
        txt.setText(Parse your response);
    }

从AsyncTask进行回调,如下所示

private class DownloadTextTask extends AsyncTask {
 MainActivity instance=null;
   public DownloadTextTask(MainActivity instance){
      this.instance=instance;
   }


    protected String doInBackground(String... urls) {
        return DownloadText(urls[0]);
    }
    @Override
    protected void onPostExecute(String result) {
        Toast.makeText(getBaseContext(), result, Toast.LENGTH_LONG).show();
      if(instance!=null){
           instance.callback(result);
       }

    }

}
并在MainActivity中添加一个名为callback的方法

public class MainActivity extends AppCompatActivity {
.... your code......
  public void callback(String result){
   txt.setText(Parse your response);
  }
}
您需要从mainactivity拨打以下电话

new DownloadTextTask(this).execute("http://www.test.com/file.xml");

从AsyncTask进行回调,如下所示

private class DownloadTextTask extends AsyncTask {
 MainActivity instance=null;
   public DownloadTextTask(MainActivity instance){
      this.instance=instance;
   }


    protected String doInBackground(String... urls) {
        return DownloadText(urls[0]);
    }
    @Override
    protected void onPostExecute(String result) {
        Toast.makeText(getBaseContext(), result, Toast.LENGTH_LONG).show();
      if(instance!=null){
           instance.callback(result);
       }

    }

}
并在MainActivity中添加一个名为callback的方法

public class MainActivity extends AppCompatActivity {
.... your code......
  public void callback(String result){
   txt.setText(Parse your response);
  }
}
您需要从mainactivity拨打以下电话

new DownloadTextTask(this).execute("http://www.test.com/file.xml");

最好使用XML和XML解析器将数据从XML文件检索到textView,看看这个示例

public class XMLParser {

public static List<Object> parseFeed(String content) {

    try {

        boolean inDataItemTag = false;
        String currentTagName = "";
        Object xyz = null;
        List<Object> xyzList = new ArrayList<>();

        XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
        XmlPullParser parser = factory.newPullParser();
        parser.setInput(new StringReader(content));

        int eventType = parser.getEventType();

        while (eventType != XmlPullParser.END_DOCUMENT) {

            switch (eventType) {
                case XmlPullParser.START_TAG:
                    currentTagName = parser.getName();
                    if (currentTagName.equals("product")) {
                        inDataItemTag = true;
                        xyz = new Object();
                        xyzList.add(xyz);
                    }
                    break;

                case XmlPullParser.END_TAG:
                    if (parser.getName().equals("product")) {
                        inDataItemTag = false;
                    }
                    currentTagName = "";
                    break;

                case XmlPullParser.TEXT:
                    if (inDataItemTag && xyz != null) {
                        switch (currentTagName) {
                            case "productId":
                                xyz.setProductId(Integer.parseInt(parser.getText()));
                                break;
                            case "name":
                                xyz.setName(parser.getText());
                                break;
                            case "instructions":
                                xyz.setInstructions(parser.getText());
                                break;
                            case "category":
                                xyz.setCategory(parser.getText());
                                break;
                            case "price" :
                                xyz.setPrice(Double.parseDouble(parser.getText()));
                                break;
                            case "photo" :
                                xyz.setPhoto(parser.getText());
                            default:
                                break;
                        }
                    }
                    break;
            }

           eventType = parser.next();

        }

        return xyzList;
    } catch (Exception e) {
        e.printStackTrace();
        return null;
    }       
}   
}
公共类XMLParser{
公共静态列表源(字符串内容){
试一试{
布尔值inDataItemTag=false;
字符串currentTagName=“”;
对象xyz=null;
List xyzList=new ArrayList();
XmlPullParserFactory工厂=XmlPullParserFactory.newInstance();
XmlPullParser=factory.newPullParser();
setInput(新的StringReader(内容));
int eventType=parser.getEventType();
while(eventType!=XmlPullParser.END_文档){
开关(事件类型){
case XmlPullParser.START_标记:
currentTagName=parser.getName();
if(currentTagName.equals(“产品”)){
inDataItemTag=true;
xyz=新对象();
xyzList.add(xyz);
}
打破
case XmlPullParser.END_标记:
if(parser.getName().equals(“产品”)){
inDataItemTag=false;
}
currentTagName=“”;
打破
case XmlPullParser.TEXT:
if(inDataItemTag&&xyz!=null){
开关(当前标记名){
案例“productId”:
setProductId(Integer.parseInt(parser.getText());
打破
案例“名称”:
setName(parser.getText());
打破
案例“说明”:
setInstructions(parser.getText());
打破
案例“类别”:
setCategory(parser.getText());
打破
案例“价格”:
setPrice(Double.parseDouble(parser.getText());
打破
案例“pho”