我是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"));
}
}
答案 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文件。