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

我正在尝试使用AsyncTask类来获取网站的内容. logcat告诉我W / art:暂停所有线程:15(或任何其他数字)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();

        }

    }


}
最佳答案
以下行是一个问题:

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/");
    }


}

转载注明原文:java – 应用程序在使用AsyncTask时挂起并挂起所有线程 - 代码日志