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

时间:2016-07-04 07:25:03

标签: android android-studio web android-asynctask

我是Android新手并且不太了解。我需要帮助来更改此代码 - 我想从网站下载一些文本。

如果我使用代码:     新的DownloadTextTask()。执行(" http://www.test.com/file.xml");

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

如何解决此问题,或者只使用此代码: (我的意思是直接使用DownloadText()函数!当我尝试时它没有用!)

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

所有代码:

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"));

    }
}

3 个答案:

答案 0 :(得分:3)

从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");

答案 1 :(得分:0)

在代码中设置文字

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

答案 2 :(得分:0)

最好使用XML Parser将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;
    }       
}   
}

这是一个XML解析器的示例,来自具有ProductId,Name,Instructions,Price和Photo的XML文件。