2012-11-22 53 views
0

我正在使用AsyncTask從網站獲取信息以進行我正在進行的一個小型學習項目。我已經嘗試過我的代碼,它「試圖」做我打算做的事情,雖然我有一個小問題。通過引用傳遞參數而不是值

我傳遞一個字符串作爲參數在AsyncTask中執行,但該參數是由地址而不是值引用。爲什麼會這樣,以及如何正確地在UI線程和後臺線程之間傳遞參數?

這是我的代碼,其中的參數傳遞:

ibSearch.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 
      Editable artnrInput = input.getText(); 
      String artnr = artnrInput.toString(); 
      new Connection().execute(artnr); 
     } 
    }); 

我到目前爲止已經調試它和參數「artnr物品」是這裏的值。

這是我的AsyncTask的一部分發生錯誤:

public class Connection extends AsyncTask<String, String, String>{ 

    @Override 
    protected String doInBackground(String... artnr) { 
     String url = "http://mobil.systembolaget.se/SokDryck/SokDryck.aspx?artnr="+ artnr + "&lan=01"; 

我想要什麼我的字符串URL的樣子是這樣的,例如: http://mobil.systembolaget.se/SokDryck/SokDryck.aspx?artnr=221101&lan=01

它能做什麼,當我調試它像,使它不工作是這樣的:

http://mobil.systembolaget.se/SokDryck/SokDryck.aspx?artnr=[Ljava.lang.String;@43e4c9f8&lan=01 

我試過一個簡單的toString(),但它更多的是一個猜測。爲什麼它不是作爲一個價值傳遞的,而是一個參考?

謝謝 ž

+0

字符串的基準是按值傳遞。 Java中根本不傳遞對象,更不用說通過值或引用。 – EJP

回答

4

您應該使用artnr[0](這是要傳遞的唯一參數),而不是artnr(因爲String... artnr是String數組對象不是一個String對象):

String url = "http://mobil.systembolaget.se/SokDryck/SokDryck.aspx?artnr="+ artnr[0] + "&lan=01"; 

一邊說,看到How Java passes objects as arguments by value

+0

非常感謝! –

1

String... artnrvar-args,實際上只是一個數組。當您打印artnr時,您正在打印數組參考的值。

你需要改變你的url字符串打印artnr[0],而不是artnr打印字符串: -

String url = "http://mobil.systembolaget.se/SokDryck/SokDryck.aspx?artnr=" + 
      artnr[0] + "&lan=01"; 
+0

非常感謝! –

+0

@Zyril。知道Java按價值傳遞* everything *是有用的。在談論對象時,「引用」是一個壞詞,因爲它們更精確地是指針。一個對象「傳遞」給一個方法(無法完成)實際上正在傳遞一個指針的值。該值是實際指針的副本,通過將對象「傳遞」到Java方法然後嘗試更改該對象,可以輕鬆演示該指針。您可以修改它的屬性,但不能更改該對象。編輯我剛剛發現Eng.Fouads答案這是一個很好的解釋這個鏈接。 – Simon

+0

@Simon ..呼吸男子呼吸。其實你是對的。編輯答案。 :) –

相關問題