我想阅读远程文本文件并在textview中显示其内容。我已编写此代码,但它没有从文本文件中获取任何信息并且“强制停止”错误。我怎样才能找到这个问题的原因或解决它?我的代码没有任何问题吗?
private class DownloadFile extends AsyncTask<String, Integer, Void> {
protected void doInBackground() {
try {
URL url = new URL("http://host/f.txt");
BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));
String line = null;
while ((line = in.readLine()) != null) {
//get lines
}
in.close();
lbl.setText(line);
}
catch (MalformedURLException e) {
e.printStackTrace();
}
catch (IOException e) {
e.printStackTrace();
}
}
protected void onProgressUpdate() {
//called when the background task makes any progress
}
protected void onPreExecute() {
//called before doInBackground() is started
}
protected void onPostExecute() {
//called after doInBackground() has finished
}
@Override
protected Void doInBackground(String... arg0) {
// TODO Auto-generated method stub
return null;
}
}
和我的onCreate代码:
DownloadFile d=new DownloadFile();
d.doInBackground();
请解决我的问题!
答案 0 :(得分:0)
一些事情:
1)您无法从后台线程修改UI线程。 doInBackground()
在后台线程上运行,您应该在onPostExecute()
上更新您的用户界面。
2)您有两个doInBackground()
的实现。第一个不会覆盖AsyncTask中的doInBackground()
。将此代码移动到覆盖AsyncTask
3)doInBackground()
应返回一个String,以便您可以使用它来更新onPostExecute中TextView上的文本。 AsyncTask看起来应该是AsyncTask<String,Void,String>
4)当你创建DonwloadFile()
实例时,你应该调用它的execute(),否则后台线程将无法启动,doInBackground()
将不会被调用。
5)你的while循环只检查InputStream上是否还有数据,但它没有存储在任何地方。使用StringBuilder
附加here等传入信息。
答案 1 :(得分:0)
如果您从Logcat发布异常堆栈跟踪,人们可以更轻松地帮助您。
如果您使用的是Eclipse并且不知道我在说什么,请查看here
答案 2 :(得分:0)
您可以使用droidQuery库来处理此问题,并捕获您可能遇到的任何错误:
$.ajax(new AjaxOptions().context(this).url("http://example.com/f.txt").dataType("text").success(new Function() {
@Override
public void invoke($ d, Object... params) {
String fileContents = (String) params[0];
Log.i("File contents", fileContents;
}
}).error(new Function() {
@Override
public void invoke($ d, Object... params) {
AjaxError error = (AjaxError) params[0];
Log.e("Ajax", "Error " + error.status + ": " + error.reason);
}
}));
另请务必检查您的AndroidManifest.xml
文件。您是否要求INTERNET
使用许可?