AsyncTask实际上不是异步的

时间:2018-06-25 13:03:38

标签: android

我遇到线程问题。当我尝试用TextView编写成功下载百分比时,它根本不会更新它,直到最后(直到收到所有内容)为止,最后只显示100。

似乎它实际上并未在其他线程中运行...

我尝试在控制台中使用日志记录,而不是使用 publishProgress ,它可以工作。似乎 MainActivity 被冻结,直到完成下载任务。

    public class DownloadTask extends AsyncTask<String, Integer, String> {

    @Override
    protected String doInBackground(String... urls) {
        String result = "";
        URL url;
        HttpURLConnection urlConnection = null;

        try {
            url = new URL(urls[0]);
            urlConnection = (HttpURLConnection)url.openConnection();
            InputStream in = urlConnection.getInputStream();
            InputStreamReader reader = new InputStreamReader(in);

            int count = 0;
            int size = 0;

            while (reader.read() != -1) {
                size++;
            }

            urlConnection = (HttpURLConnection)url.openConnection();
            in = urlConnection.getInputStream();
            reader = new InputStreamReader(in);

            int data = reader.read();

            while (data != -1) {
                char current = (char) data;
                result += current;

                int progress = (int) (((float) count++ / (float) size) * 100);
                publishProgress(progress);

                data = reader.read();
            }

            return result;
        }
        catch(Exception e) {
            e.printStackTrace();
            return "Failed";
        }
    }

    @Override
    protected void onProgressUpdate(Integer... values) {
        textView.setText((values[0]).toString());
    }
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    textView = findViewById(R.id.text);

    DownloadTask task = new DownloadTask();
    String result = null;

    try {
        result = task.execute("https://stackoverflow.com/").get();
    }
    catch (Exception e) {
        e.printStackTrace();
    }

    Log.i("Contents Of URL", result);
}

请帮忙吗?

1 个答案:

答案 0 :(得分:1)

您正在根据docs在ASyncTask中使用get方法。

  

在必要时等待计算完成,然后检索   其结果。

这意味着您告诉异步任务同时运行。

要使其异步运行,请不要使用get方法。

task.execute("https://stackoverflow.com/")

并使用onPostExecute检索结果:

 protected void onPostExecute(String result) {

 }