Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/210.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android AsyncTask和NetworkOnMainThreadException_Android_Android Asynctask_Networkonmainthread - Fatal编程技术网

Android AsyncTask和NetworkOnMainThreadException

Android AsyncTask和NetworkOnMainThreadException,android,android-asynctask,networkonmainthread,Android,Android Asynctask,Networkonmainthread,我正在开发一个使用Jsoup的Android应用程序。在开发的早期,我一直致力于实现任何类型的线程,因为我只想在处理线程之前完成大部分代码。我现在正尝试使用AsyncTask,但仍然出现NetworkOnMainThreadException错误。我已经阅读了大量关于AsyncTask的教程和帖子,但似乎仍然可以确定问题所在。当我添加StrictMode时。。。代码中,除了使用Jsoup加载数据时的UI锁定外,该应用程序可以按需要工作。如果有人能告诉我在异步任务方面我做错了什么,我将不胜感激。另

我正在开发一个使用Jsoup的Android应用程序。在开发的早期,我一直致力于实现任何类型的线程,因为我只想在处理线程之前完成大部分代码。我现在正尝试使用AsyncTask,但仍然出现NetworkOnMainThreadException错误。我已经阅读了大量关于AsyncTask的教程和帖子,但似乎仍然可以确定问题所在。当我添加StrictMode时。。。代码中,除了使用Jsoup加载数据时的UI锁定外,该应用程序可以按需要工作。如果有人能告诉我在异步任务方面我做错了什么,我将不胜感激。另外,我知道有很多代码冗余需要清理,但我想先让AsyncTask工作起来

public void onCreate(Bundle savedInstanceState)  {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);  

            /***This is the work around used***/
            StrictMode.ThreadPolicy policy = new     StrictMode.ThreadPolicy.Builder().permitAll().build();
            StrictMode.setThreadPolicy(policy);
            /******/  



            up = new TreeMap<Double, String[]>(); 

            c1 = "example.com/1";
            //instansiate textviews (6)
                    doc1 = doc;
            c2 = "example.com/2";
            //instansiate textviews (6)
                    doc2 = doc;
            c3 = "example.com/3";
            //instansiate textviews (6)
            doc3 = doc;

            // instansiate textviews(16)

            new Download().execute(c1,c2,c3);

   } 
        private class Download extends AsyncTask<String, Integer, String[][]> {
            @Override
            protected String[][] doInBackground(String... urls){
                out = new String[7][3];
                try {
                    doc = Jsoup.connect(urls[0]).data().get();          
                    //days, times, and cs arrays created and filled

                    String[] out1arr = {days[0], times[0], cs[0]};
                    //...all 7
                    String[] out7arr = {days[6], times[6], cs[6]};
                    String[][] outarrs = {out1arr,out2arr,out3arr,out4arr,out5arr,out6arr,out7arr};
                    for (int i= 0; i < out.length; i++){
                        out[i] = outarrs[i];
                    }
                } catch (IOException e1) {
                    e1.printStackTrace();
                }
                return (out);
            }
            @Override
            protected void onProgressUpdate(Integer... progress){
            }
            @Override
            protected void onPostExecute(String[][] result){

                Do(/*textviews(6)*/, c1, a, outa, "example1"); //a is previously instantiated double array, outa is preiously instantiated string array
                Do(/*textviews(6)*/, c2, b, outb, "example2");
                Do(/*textviews(6)*/, c3, c, outc, "example3");


                upc00.setText(getUpc()[0][0]);
                //setText for all 16
                upc32.setText(getUpc()[3][2]);

            }

            private void Do(TextView t, TextView u, TextView v, TextView w, TextView x, TextView y,String webpage, double[] darr, String[] sarr, String show){


                t.setText(doInBackground(webpage)[0][0]);
                //...all 6
                y.setText(doInBackground(webpage)[1][2]);       
                for (int i =0; i < darr.length; i++){
                    darr[i] = tis[i];
                    up.put(darr[i], out[i]);
                }
            }
        }
        private ArrayList<String[]> getMap(){
                //...
            return s;
        }
        private String[][] getUpc(){
            //...
            return upc;
        }
框架调用doInBackground,您不应该自己调用它。代码从onPostExecute进行调用,该调用由UI线程上的框架调用。因此,您的调用有效地运行在UI线程上


将抓取逻辑全部移到doInBackgound方法中。应使用onPostExecute方法将结果传递给调用者。

谢谢。我需要重新排列大量代码,但根据您建议的更改,现在的加载时间是~1秒,而不是以前的10-15秒。