Android:线程中的网络主要异常

时间:2016-03-29 17:33:46

标签: java android multithreading

我使用此代码更改了tabs的{​​{1}}名称,但我收到了此错误:

HTML

我知道您无法对android.os.NetworkOnMainThreadException android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork networks执行main次操作,但我在这里使用thread因此应该是此错误。

runOnUiThread

3 个答案:

答案 0 :(得分:0)

axis([XMIN XMAX YMIN YMAX]

您显然正在主线程中进行网络操作,因为I know you can't do networks operations on the main thread将在主线程上运行,而您正在调用runOnUiThread这是一个网络连接。

您需要创建一个优于Jsoup.connect的{​​{1}};除非你正在做一个长期运行的任务。

答案 1 :(得分:0)

您无法在UI线程上运行网络操作,因为您的界面将冻结,直到网络运行结束,您可以使用AsyncTask,这是此类操作的完美解决方案。使用AsyncTask,您可以在网络操作之后(甚至在网络操作期间)运行网络操作并更新UI。例如:

 new AsyncTask<String, String, Elements>(){

        @Override
        protected Elements doInBackground(String... params) {
            Document doc = Jsoup.connect("http://terry.gonguet.com/cal/?g=tp11").get();
            Elements days = doc.select("div.day");

            return days;
        }

        @Override
        protected void onPostExecute(Elements days) {

            for (Element day : days) {
                String jour = day.getElementsByClass("dayDate").first().html();

                mSectionsPagerAdapter.AddFragment(new MainFragment().newInstance(1), jour);
            }
            }
    }.execute();

答案 2 :(得分:0)

您应该只在UI线程中添加片段而不是请求,因此这应该有效:

Thread thread = new Thread() {
    @Override
    public void run() {     
        try
        {
            Document doc = Jsoup.connect("http://terry.gonguet.com/cal/?g=tp11").get();
            Elements days = doc.select("div.day");

            runOnUiThread(new Runnable() {
                @Override
                public void run()
                {
                    for (Element day : days)
                    {
                        String jour = day.getElementsByClass("dayDate").first().html();

                        mSectionsPagerAdapter.AddFragment(new MainFragment().newInstance(1), jour);



                    }

                }
            });
        } catch (IOException ex){}          
    }
};
thread.start();