2012-12-29 70 views
1

我正在使用Jsoup的Android應用程序。在開發初期,我「解決了」必須實現任何類型的線程,因爲我只想在處理線程之前完成大部分代碼。我現在試圖使用AsyncTask,但我仍然收到NetworkOnMainThreadException錯誤。我已經閱讀了大量的AsyncTask教程和SO帖子,但仍然可以確定問題。當我添加StrictMode ...代碼時,除了使用Jsoup加載數據時的UI鎖定以外,該應用程序按需要工作。如果有人能告訴我我在做什麼錯誤有關AsyncTask,我將不勝感激。 (附註:我知道有很多代碼冗餘來清理,但我希望得到的AsyncTask工作第一)Android AsyncTask和NetworkOnMainThreadException

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

回答

0

框架調用doInBackground你不應該自己調用它。您的代碼在UI線程上調用框架調用的onPostExecute。因此,您的調用在UI線程上運行得非常有效。

將提取邏輯全部移到doInBackgound方法中。應使用onPostExecute方法將結果傳遞給調用者。

+0

謝謝。我需要重新安排很多代碼,但根據您所建議的更改,加載時間現在爲1秒,而不是以前的10-15秒。 – user1935594

相關問題