0

我想读取远程文本文件并在文本视图中显示其内容。我已经编写了这段代码,但它没有从文本文件中获取任何信息,并且出现“强制停止”错误。我怎样才能找到这个问题的原因或解决它?我的代码没有什么问题吗?

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

请解决我的问题!

4

3 回答 3

0

几件事:

1) 您不能从后台线程修改 UI 线程。doInBackground()在后台线程上运行,您应该在onPostExecute().

2)你有两个实现doInBackground()。第一个不会覆盖doInBackground()AsyncTask 中的。将此代码移至覆盖 AsyncTask 的代码

3)doInBackground()应该返回一个字符串,以便您可以使用它来更新 onPostExecute 中 TextView 上的文本。AsyncTask 应该是这样的AsyncTask<String,Void,String>

4)当你创建DonwloadFile()实例时,你应该调用它的execute(),否则后台线程将不会启动并且doInBackground()不会被调用。

5) 您的 while 循环仅检查 InputStream 上是否仍有数据,但不会将其存储在任何地方。使用 aStringBuilder附加传入信息,如此

于 2013-09-03T19:31:31.917 回答
0

如果您从 Logcat 发布异常堆栈跟踪,人们会更容易帮助您。

如果您正在使用 Eclipse 并且不知道我在说什么,请看这里

于 2013-09-03T19:33:37.820 回答
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 使用许可

于 2013-09-03T19:34:52.743 回答