Assync Task冻结UI

时间:2016-10-08 13:05:15

标签: java android android-asynctask

我使用AsyncTask下载文件。但是当它下载文件时,UI会被冻结,我必须等待文件完成下载以便能够执行某些操作。我查看了其他线程,但我发现了使用.get()运行任务等问题。 这就是我如何调用AsyncTask

new DownloadFileFromUrl().execute("url");

这里是AsyncTask

class DownloadFileFromURL extends AsyncTask<String, Integer, LineData> {

    String fileDir = getApplicationContext().getFilesDir() + "/data.txt";

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
    }

    @Override
    protected LineData doInBackground(String... f_url) {
        int count;
        //Download file--------------------------
        try {
            URL url = new URL(f_url[0]);
            URLConnection conection = url.openConnection();
            conection.connect();
            int lenghtOfFile = conection.getContentLength();
            InputStream input = new BufferedInputStream(url.openStream(),
                    8192);
            OutputStream output = new FileOutputStream(fileDir);
            byte data[] = new byte[1024];
            long total = 0;
            while ((count = input.read(data)) != -1) {
                total += count;
                publishProgress((int) total * 100 / lenghtOfFile);
                output.write(data, 0, count);
            }
            output.flush();
            output.close();
            input.close();
        } catch (Exception e) {
            Log.e("Error: ", e.getMessage());
        }
        return null;
    }

    @Override
    protected void onPostExecute(LineData data) {
        setDataFor24Hours();
        setDataFor48Hours();
        setDataFor72Hours();
        showDataFor24Hours();
        setList();
        Log.e("Downloader: ", "done!");
    }

}

我已经将它Done!发送到监视器,此时UI也会解冻,因此问题出在AsyncTask中。 我希望有人能帮助我。提前谢谢!

2 个答案:

答案 0 :(得分:1)

AsyncTask设计使我们可以在不冻结UI的情况下执行操作。 但doInBackground仅在后台运行。但是onPostExecute在UI线程上运行。所以也许你的问题在onPostExecute

答案 1 :(得分:0)

尝试这样定义。

new DownloadFileFromUrl().execute("url");