2011-11-30 78 views
0

我在下面的代碼中收到以下錯誤:返回類型與AsyncTask.onPostExecute(Integer)不兼容。我試圖從doInBackground任務中完成的http請求返回結果。我得到錯誤:類型不匹配:無法在isAvailable的返回語句中從AsyncTask轉換爲int。我覺得有些事情很簡單,我沒有做,但我無法弄清楚。Android AsyncTask(從doInBackground返回一個整數)

public int isAvailable(int position) { 
     GetIsAvailable isAvail = new GetIsAvailable(); 
     Integer nisAvail = isAvail.execute(position); // error is still here 
     return nisAvail; 

    } 

    private class GetIsAvailable extends AsyncTask<Integer,Void,Integer > { 

     @Override 
     protected Integer doInBackground(Integer...position) { 
      Bundle resBundle = new Bundle(); 
      String url = "http://www.testurl.com" 
       + position[0]+"&uname="+AppStatus.mUserName; 
      URL iuri; 
      try { 
       iuri = new URL(url); 
       URLConnection connection = iuri.openConnection(); 
       connection.setDoInput(true); 
       connection.setDoOutput(true); 
       connection.setUseCaches(false); 
       connection.setRequestProperty("Content-type", 
         "application/x-www-form-urlencoded"); 
       BufferedReader br = new BufferedReader(new InputStreamReader(
         (InputStream) connection.getContent())); 
       resBundle.putInt("isAvail", Integer.parseInt(br.readLine().trim())); 
      } catch (MalformedURLException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      return new Integer(0); 

      } 

     @Override 
     protected Integer onPostExecute(Integer isAvail) { // Main Error here 

      return isAvail; 
     } 
+1

這可能是完全關閉基地(?哎,我在課堂上,現在,我得到了一通,右),但你不應該'返回新的整數(0)' ? – kcoppock

+0

是的,但似乎我仍然有相同的錯誤。 – user836200

回答

2

哦,我想我看到了問題。我認爲你不能像現在這樣處理這個問題。您應該在onPostExecute()方法內處理isAvail值的影響。 isAvailable()正在主線程上運行,而isAvail正在單獨的線程上運行。您試圖在完成完成之前返回AsyncTask的結果。

我99%確定這是問題所在。

+1

您說得對,AsyncTask根本不會返回任何內容,而且您無法按照現在的方式檢索結果。結果必須在onPostExecute()上處理。 – jcxavier

+0

這是有道理的,我相信這是問題,但如何獲得onPostExecute中的整數結果返回到主線程? – user836200

+0

與其以這種方式思考,不如考慮你計劃用返回的Integer做什麼。那麼不能在'onPostExecute()'中處理呢? 'onPostExecute()'在UI線程上運行,所以如果要修改一個Activity,在這裏這樣做是安全的。 – kcoppock

1

這返回一個int:

return Integer.parseInt(br.readLine().trim()); 

這個返回一個int以及:

return 0; 

您必須返回一個整數:

return new Integer(br.readLine().trim()); 

return new Integer(0); 
+0

這是真的,但我仍然有相同的錯誤:無法從AsyncTask 轉換爲Integer,並且無法從AsyncTask 轉換爲Integer(我已更新我的代碼以包含更改) – user836200

2

我相信你在找什麼是

Integer nisAvail = isAvail.execute(position).get(); 

但隨後的任務不再是異步的UI線程必須等待,直到完成的AsyncTask。

如果你想保持它的異步,那麼你必須在onPostExecute中處理結果。

+0

+1提及AsyncTask.get(),它是可行的,但不是一個好習慣,因爲在UI線程塊線程執行上調用AsyncTask.get()並可能獲得ANR異常。 – yorkw

-1

如果你想獲得從doInBackground方法返回的值。 那麼做到這一點:

Integer Value = AsyncTaskClass.execute(ParamsIfSpecified).get(); 
+0

在這裏添加一些解釋來描述你的答案 –

+0

我已經說明了@Unni Kris –

相關問題