سؤال

I am working on an Android app that uses Jsoup. Early on in development, I "worked around" having to implement any kind of threading because I just wanted to get the bulk of the code completed before tackling threading. I am now attempting to use AsyncTask, but I am still getting the NetworkOnMainThreadException error. I have read plenty of tutorials and SO posts on AsyncTask, but still can seem to identify the problem. When I add the StrictMode... code, the app works as desired except for the UI lockup when loading the data using Jsoup. If anyone could show me what I am doing wrong pertaining to AsyncTask, I would appreciate it. (P.S. I know there is plenty of code redundancy to be cleaned up, but I want to get AsyncTask working first)

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;
        }
هل كانت مفيدة؟

المحلول

The framework calls doInBackground you should not call it yourself. Your code makes a call from onPostExecute which is called by the framework on the UI thread. So effectively your calls run on the UI thread.

Move your fetching logic all into the doInBackgound method. The onPostExecute method should be used to deliver the results to the caller.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top