我正在尝试从网址获取文本并将其显示为字符串。网址以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");
另外一个小问题是,当显示文本时,我丢失了文本的格式,因为我丢失了段落之间的空格,得到一个巨大的段落。有办法解决这个问题吗?我应该使用其他方法吗?
答案 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();
}