使用AsyncTask从URL获取文本。代码由于某种原因不起作用

时间:2013-11-28 17:56:35

标签: java android android-asynctask

我正在尝试从网址获取文本并将其显示为字符串。网址以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();

2 个答案:

答案 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");