Android AsyncTask实际上不是异步的

Android AsyncTask实际上不是异步的,android,Android,我有一个线程问题。当我尝试在TextView中写入成功下载的百分比时,它根本不会更新它,直到最后(直到收到所有内容),并且在最后只显示100 看起来它实际上并没有在另一个线程中运行 我尝试在控制台中使用日志记录,而不是使用publishProgress,而且效果很好。似乎在下载任务完成之前,MainActivity被冻结 public class DownloadTask extends AsyncTask<String, Integer, String> { @O

我有一个线程问题。当我尝试在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);
}
公共类下载任务扩展了异步任务{
@凌驾
受保护的字符串doInBackground(字符串…URL){
字符串结果=”;
网址;
HttpURLConnection-urlConnection=null;
试一试{
url=新url(url[0]);
urlConnection=(HttpURLConnection)url.openConnection();
InputStream in=urlConnection.getInputStream();
InputStreamReader reader=新的InputStreamReader(in);
整数计数=0;
int size=0;
while(reader.read()!=-1){
大小++;
}
urlConnection=(HttpURLConnection)url.openConnection();
in=urlConnection.getInputStream();
reader=新的InputStreamReader(in);
int data=reader.read();
while(数据!=-1){
当前字符=(字符)数据;
结果+=电流;
整数进度=(整数)((浮点)计数+/(浮点)大小)*100);
出版进度(progress);
data=reader.read();
}
返回结果;
}
捕获(例外e){
e、 printStackTrace();
返回“失败”;
}
}
@凌驾
受保护的void onProgressUpdate(整型…值){
textView.setText((值[0]).toString());
}
}
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView=findViewById(R.id.text);
DownloadTask任务=新建DownloadTask();
字符串结果=null;
试一试{
结果=任务。执行(“https://stackoverflow.com/).get();
}
捕获(例外e){
e、 printStackTrace();
}
Log.i(“URL内容”,结果);
}

有什么帮助吗?

您正在异步任务中使用get方法,如

如有必要,等待计算完成,然后检索 它的结果

这意味着您让异步任务以单周期运行

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

task.execute("https://stackoverflow.com/")
并使用onPostExecute检索结果:

 protected void onPostExecute(String result) {

 }

只需为OP澄清一下:
onPostExecute
方法需要在
DownloadTask
中声明。它可以在那里进行日志记录,如果需要,还可以调用
活动
类中的方法进行进一步处理(或者它可以直接更新UI,因为
onPostExecute
在UI线程上运行)。