从网址获取文本并显示它(几乎可以工作)

时间:2013-11-28 00:38:56

标签: java android android-asynctask

我正在尝试从网址获取文本并将其显示为字符串。网址以www.gains.com/more.txt中的.txt结尾。这些文字很长,最大尺寸为1MB。我正在尝试使用AsyncTask。问题是代码有时会起作用。它是我第一次运行代码第二次没有显示文本时工作。有时应用程序会显示文本有时它不会。这里发生了什么?这是我的代码。

class RequestTask extends AsyncTask<String, String, String>{

        @Override
        // username, password, message, mobile
        protected String doInBackground(String... url) {
            // constants
            int timeoutSocket = 5000;
            int timeoutConnection = 5000;

            HttpParams httpParameters = new BasicHttpParams();
            HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection);
            HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket);
            HttpClient client = new DefaultHttpClient(httpParameters);

            HttpGet httpget = new HttpGet(url[0]);

            try {
                HttpResponse getResponse = client.execute(httpget);
                final int statusCode = getResponse.getStatusLine().getStatusCode();

                if(statusCode != HttpStatus.SC_OK) {
                    Log.w("MyApp", "Download Error: " + statusCode + "| for URL: " + url);
                    return null;
                }

                String line = "";
                StringBuilder total = new StringBuilder();

                HttpEntity getResponseEntity = getResponse.getEntity();

                BufferedReader reader = new BufferedReader(new InputStreamReader(getResponseEntity.getContent()));  

                while((line = reader.readLine()) != null) {
                    total.append(line);
                }

                line = total.toString();
                story.add(line); //story is my array i use to display the text
                return line;
            } catch (Exception e) {
                Log.w("MyApp", "Download Exception : " + e.toString());
            }
            return null;
        }

        @Override
        protected void onPostExecute(String result) {
            //This is empty i dont know what it does
        }
        }

以下是我如何称呼它

new RequestTask().execute("www.gains.com/more.txt");

另外一个小问题是,当显示文本时,我丢失了文本的格式,因为我丢失了段落之间的空格,得到一个巨大的段落。有办法解决这个问题吗?我应该使用其他方法吗?

2 个答案:

答案 0 :(得分:0)

Http请求并不总是花费相同的时间。你试过增加超时吗? 5000毫秒不是很多,特别是如果你的文件大小达到1MB。

答案 1 :(得分:0)

调用显示功能,该功能将显示文件下载后保存的文件中的文本。

使用onPostExecute

    @Override
    protected void onPostExecute(String result) {
        //You add the code where you call the text from the file saved
    }

您可以从调用线程的主活动中调用函数。

这样,只有在下载和保存文本的过程完成之前,才会显示视图。

编辑:这是一个示例

    TextPage textPage; // the activity that calls the AsyncTask
List<String> story = new ArrayList<String>();

GetTextInfoTask(TextPage textPage) {
    this.textPage = textPage;
}
    ... // your doInBackground function here

@Override
protected void onPostExecute(Object objR){
    // A toast is displayed in the TextPage Activity once the data is finished downloading
    Toast.makeText(textPage.getBaseContext(), story.get(0),
            Toast.LENGTH_LONG).show();
}