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