首页 文章

Android - 下载Web内容错误 - 跳过X帧!应用程序可能在其主线程上做了太多工作

提问于
浏览
0

我正在尝试使用多线程方法下载Web内容 . 我正在关注一个在线android开发教程服务,所以我知道相信我的代码是正确的(完整的android web开发人员课程第5章) . 但是,按照要求在日志中显示部分网页后,我收到消息:

“I / Choreographer:跳过743帧!应用程序可能在其主线程上做了太多工作 . ”

我正在使用AsynTask但仍然没有运气 .

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 "Failed";
            }


        }

    }

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

        DownloadTask task = new DownloadTask();
        String result = null;
        try {
            result = task.execute("http://www.w3schools.com/html/tryit.asp?filename=tryhtml_basic_document").get();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }

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

1 回答

  • 1

    好吧,如果你直接在 onCreate() 方法中调用 AsyncTask.get() 方法,那么你有点作弊,因为代码实际上是在UI线程中执行的!

    你真的不能调用get(),因为这将等待结果,从而阻止UI线程(这正是你想要避免的)

    我猜你这样做是因为你想在你的onCreate()方法中得到结果,但你做不到 .

    通常,您需要在UI字段中显示结果(如TextView) . 在这种情况下,您应该使用 Handler 实例再次使用UI线程中的值 .


    更正代码:

    public class MainActivity extends AppCompatActivity {
    
        public class DownloadTask extends AsyncTask<String, Void, String> {
    
            @Override
            protected void onPostExecute(Result result) { 
               Log.i("Contents of URL", result);
            }
    
            @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 "Failed";
                }
    
    
            }
    
        }
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            DownloadTask task = new DownloadTask();
            task.execute("http://www.w3schools.com/html/tryit.asp?filename=tryhtml_basic_document");
    
        }
    }
    

相关问题