应用程序在使用AsyncTask时挂起并挂起所有线程

Emi*_*ård 8 java multithreading android

我正在尝试使用AsyncTask该类来获取网站的内容.logcat W/art: Suspending all threads took: 15(or any other number)ms反复告诉我.我的应用程序被冻结,直到日志消息完成打印.日志完成后,UI会显示.我按照教程进行了双重检查,我的代码应与教程相同.过了一会儿,它会从网站上记录几行代码,但仅此而已.我也尝试过不同的网站.这是我的AsyncTask:

public class MainActivity extends AppCompatActivity {

    public class DownloadTask extends AsyncTask<String, Void, 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 data = reader.read();

                while (data != -1) {

                    char current = (char) data;

                    result += current;

                    data = reader.read();

                }

                return result;

            } catch (Exception e) {

                e.printStackTrace();

            }

            return null;
        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

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

        try {

            result = task.execute("http://www.vg.no/").get();

            Log.i("URL content" , result);

        } catch (InterruptedException e) {

            e.printStackTrace();

        } catch (ExecutionException e) {

            e.printStackTrace();

        }

    }


}
Run Code Online (Sandbox Code Playgroud)

ade*_*hus 15

以下行是一个问题:

result = task.execute("http://www.vg.no/").get();

.get()陈述的一部分意味着"等到任务完成".这有效地阻止了任务执行时的UI线程.

只需让后台任务完成它的工作并通过它获得任何结果onPostExecute().查看以下AsyncTask:

public class MainActivity extends AppCompatActivity {

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

        @Override
        protected String doInBackground(String... urls) {
            ...
        }

        @Override
        protected void onPostExecute(String result) {
            Log.i("URL content" , result);
        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        DownloadTask task = new DownloadTask();
        task.execute("http://www.vg.no/");
    }


}
Run Code Online (Sandbox Code Playgroud)

  • @EmilØgård这些消息对所有应用程序都是通用的,您不应该担心.它们只是Android框架日志记录的一部分,用于诊断内存管理问题和调试问题.在几乎所有的应用程序中,它们都可以被安全地忽略(并且你无法摆脱它们). (5认同)
  • 更具体地说,"标记扫描GC"的事情是报告垃圾收集器正在做什么来回收内存."挂起所有线程"消息是因为当垃圾收集器完成其工作时,所有线程都必须被挂起.这个特殊的扫描大约需要24毫秒,或大约十分之一的眨眼.;-) (2认同)
  • @EmilØgård可能是因为你试图记录过多的数据.logcat中的日志旨在打印短消息,如果消息太长则会简单地剪切消息.我下载了您正在使用的网站:输出超过380K,第4行超过13,000个字符 - 这是一个疯狂的尝试在系统日志中打印的数量.如果要查看,只需将输出保存到文件或将其加载到TextView中. (2认同)