我正在尝试从网址获取文本并将其显示为字符串。网址以www.gains.com/more.txt中的.txt结尾。这些文字很长,最大尺寸为1MB。我试图用AsyncTask来获取它们。问题是代码有时会起作用,有时却不起作用。我不明白为什么。
这是AsyncTask代码。
class RequestTask extends AsyncTask<String, String, String>{
@Override
// username, password, message, mobile
protected String doInBackground(String... url) {
// constants
int timeoutSocket = 15000; //Is this enough for 1MB files?
int timeoutConnection = 15000;
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;
}
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();
return line;
} catch (Exception e) {
Log.w("MyApp", "Download Exception : " + e.toString());
}
return null;
}
@Override
protected void onPostExecute(String result) {
story.add(result); //story is the array which I use to display the downloaded text
}
}
以下是我的称呼方式。我在一个不是OnCreate的方法中调用它,我甚至在新线程中执行它以避免NetworkOnMainThreadException错误。
new Thread() {
@Override
public void run() {
new RequestTask().doInBackground("www.gains.com/more.txt");
new RequestTask().onPostExecute(line);
}
}.start();
答案 0 :(得分:3)
这不是调用asynctask的正确方法。你不能打电话给doinbackground direclty,也不能发出postexecute。 你要做的只是写:
RequestTask MyAsynchTask = new RequestTask().
MyAsynchTask.execute("www.gains.com/more.txt");
是公共执行方法,它将为您调用所有方法:preexecute,doinbackground和postexecute。
并且您不会遇到此解决方案的ANR问题(应用程序无响应)。
告诉我你是否可以
你说:有时候它有时候不行吗?当你写:requestTask().doInBackground("www.gains.com/more.txt");
new RequestTask().onPostExecute(line);
如果doinbackground完成了,那么java不能在postexecute中知道!所以有时你会得到你的结果,有时候没有,这取决于java在doinbackground方法中工作的时间。
实现Asynchtask的唯一方法就是按照我上面的说法去做。如果您因为其他原因而没有您希望在结果中获得的数据。
它只能运行:如果你想再次运行它,你必须创建另一个RequestTask实例
答案 1 :(得分:0)
而不是以下代码:
new Thread() {
@Override
public void run() {
new RequestTask().doInBackground("www.gains.com/more.txt");
new RequestTask().onPostExecute(line);
}
}.start();
仅使用:
new RequestTask().execute("www.gains.com/more.txt");