2017-08-11 36 views
1

我對Android開發很新,但我知道我不能在沒有某種線程的情況下運行Jsoup.connect(url).get(),因爲它是一個同步調用。我嘗試創建一個名爲Product的類來擴展AsyncTask,然後讓我的原始類名爲List call Product,然後顯示int。但是,無論實際結果如何,它總是打印出0.如何使用Android的AsyncTask通過JSoup獲取所有數據,然後將該信息發送給另一個類?

我之前測試過我的代碼,所以我知道它的工作原理以及該問題必須與Android相關。

列表類:

public class List extends AppCompatActivity{ 
String itemURL; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_item_list_view); 
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 

     Bundle itemData = getIntent().getExtras(); 
    if(itemData==null){ 
     return; 
    } 

    //Gets URL 
    itemURL = itemData.getString("itemURL"); 
    int listSize=new Product(itemURL).getListSize(); 
    System.out.println(listSize); 
} 
} 

產品類:

public class Product extends AsyncTask<Void,Void,Void>{ 
    String url; 
    String title; 
    int listSize; 


    public Product(String url){ 
     this.url = url; 
    } 
    protected Void doInBackground (Void... voids) { 
     //Create JSoup connection 
     try{ 

      Document doc = Jsoup.connect("url").get(); 
      //Gets title 
      String link = doc.select("h2#s-result-count").first().text(); 
      System.out.println(link); 
      listSize=Integer.parseInt(link.substring(0,1)); 
      System.out.println(listSize); 
      try{ 
       int listSize= Integer.parseInt(link.substring(0,2)); 
       System.out.println(listSize); 
       }catch(Exception e){} 
     }catch (Exception e){} 
    } 


     protected void onPostExecute(Void aVoid) { 
      super.onPostExecute(aVoid); 
      getListSize(); 


     } 

     public int getListSize(){ 
     return listSize; 
    } 
} 

所有建議,將不勝感激,感謝您的時間和幫助!

+0

請嘗試以下代碼 Product product = new Product(itemURL); product.execute() –

回答

1

您必須覆蓋

onPostExecute() 

,以確保您得到的變量是從線程更新後。打電話給你的

getListSize() 

從裏面覆蓋函數。

考慮,調用

execute() 

,然後立即調用

getListSize() 

將由線,而實際的線程你已經剝離出來會繼續工作發生線。您要求的價值尚未更新。

編輯::

對於澄清:

public class List extends AppCompatActivity{ 
    String itemURL; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_item_list_view); 
     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 

     Bundle itemData = getIntent().getExtras(); 
     if(itemData==null){ 
      return; 
     } 

     //Gets URL 
     itemURL = itemData.getString("itemURL"); 
     int listSize=new Product(itemURL).getListSize(); // this doesn't do anything meaningful for you 
     System.out.println(listSize); 
    } 
} 

注意我已經加入到

INT LISTSIZE =新產品的註釋(itemURL).getListSize();

首先,

doInBackground()

永遠不會運行,直到您叫

的execute()

你需要調用

new Product(itemURL).execute(); 

後記,你必須提供某種回調到活動因爲你還沒有嵌套的產品類別或初始化的AsyncTask的一個匿名實例。

在你的產品類,你可以設置一個變量

語境

​​3210

然後,在地方

INT LISTSIZE =新產品(itemURL)的.getListSize ();

地說:

Product product = new Product(); 
product.context = this; 
product.execute(); 

然後,在產品的

onPostExecute()

地說:

if (context.getClass().equals(List.class)) { 
    ((List) context).some_method_that_does_something_with_list_size() 
} 

或者,你可以將其添加到產品的構造函數:

public Product(String url, Context context) {...} 

編輯2 ::

爲了進一步澄清

((名單)上下文).some_method_that_does_something_with_list_size()

旨在用作活動中可用方法的地標。

System.out.println(listSize); 

編輯3 ::

爲了進一步,進一步澄清:它可以容易地與取代

在你的活動,ItemListView,定義了一個名爲

printListSize(int listSize) { 
    System.out.println("list size: " + listSize); 
} 

然後方法,在onPostExecute()調用中:

((ItemListView) context).printListSize(listSize); 
+0

對不起,我不認爲我完全理解你所建議的一切。我已覆蓋onPostExecute()並更新了上面的代碼以反映這一點。我現在應該怎麼做? – coolyfrost

+0

花了一秒鐘來更新。對不起 – anomeric

+0

在最後一步,如果我嘗試調用((List)上下文).getListSize()它不工作,大概是因爲我們將它作爲List進行類型化,List沒有getListSize,但Product沒有。我做錯了什麼或者錯誤地思考它? – coolyfrost

相關問題