2016-03-28 35 views
-1

這裏是我的代碼:我如何獲得在方法DoInBackground中聲明的變量?

  class OpenERP extends AsyncTask<Context, Void, Integer> 
       @Override 
        protected Integer doInBackground(Context ... params) { 

        try{ 

        final Integer id = (Integer) models.execute("execute_kw", asList(
          db, uid, password, 
          "pointage.task", "create", 
          asList(new HashMap() { 
           { 
            put("name", "Hello"); 
           } 


          }) 
        ));} 
        catch (XmlRpcException e) { 
        Log.e(TAG, "Xml Rpc Excception " + e.getMessage()); 
       } 

      return id; 
     } 
     @Override 
     protected void onPostExecute(Integer id) { 
      hello.setText(id); 

     } 
     } 

我想要得到的變量ID在我後面的代碼使用。 我得到的錯誤:無法解析symbil id! 因爲它是在集團內部聲明的{try}。 要做什麼??!

回答

0

傳遞變量onPostExecute。像這樣的Async Task

更改簽名:

class OpenERP extends AsyncTask<Context, Void, Integer>

回報iddoInBackground

protected Integer doInBackground(Context... params) { 
    .... 
    return id; 
} 

然後覆蓋onPostExecute

protected void onPostExecute(Integer id) { 
    // use id here. 
} 

編輯1:

根據評論,這是你應該如何使用它。

protected Integer doInBackground(Context ... params) { 
       Integer id = Integer.valueOf(0); 
       try{ 

       id = (Integer) models.execute("execute_kw", asList(
         db, uid, password, 
         "pointage.task", "create", 
         asList(new HashMap() { 
          { 
           put("name", "Hello"); 
          } 


         }) 
       ));} 
       catch (XmlRpcException e) { 
       Log.e(TAG, "Xml Rpc Excception " + e.getMessage()); 
      } 

     return id; 
} 

希望這可以幫助你!

+0

是的,我想它就像tht,但變量id是在集成塊try {}中聲明的,所以當我把返回id,我得到:無法解析可變ID! @RohitArya – Steven7

+0

如果你可以''返回''doInBackground',那麼你可以使用它。更新完整的代碼,如果你不知道如何做到這一點。 –

+0

我更新我的代碼@RohitArya,我該如何改變它,所以我可以使用變量ID? – Steven7

0

將它聲明爲一個類變量,而不是在方法中聲明它。在這種情況下,將其聲明爲OpenERP類的成員。

-1

將doInBackground的返回類型更改爲int,並在doInBackground中返回您的整數值,並且您始終可以在onPostExecute中將其作爲int獲取。下面的示例,

private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> { 
    protected Long doInBackground(URL... urls) { 
     int count = urls.length; 
     long totalSize = 0; 
     for (int i = 0; i < count; i++) { 
      totalSize += Downloader.downloadFile(urls[i]); 
      publishProgress((int) ((i/(float) count) * 100)); 
      // Escape early if cancel() is called 
      if (isCancelled()) break; 
     } 
     return totalSize; 
    } 

    protected void onProgressUpdate(Integer... progress) { 
     setProgressPercent(progress[0]); 
    } 

    protected void onPostExecute(Long result) { 
     showDialog("Downloaded " + result + " bytes"); 
    } 
} 
0

只需聲明爲全局變量並在本地進行初始化即可。

int id; 
@Override 
protected int doInBackground(Context...params){ 
    id = /** your desired code*/ 
    return id; 
} 

或者,你可能會改變異步任務的參數作爲

private class DownloadFilesTask extends AsyncTask<Context, Void, int> 

,讓你做你doInBackground返回int值趕在onPostExecute。

@Override 
protected void onPostExecute(int result){ 
//access result ass your int value 
} 
0
class OpenERP extends AsyncTask<Context, Void, Void> { 
    private ERPListener mListener; 
    public OpenERP(ERPListener listener){ 
      this.mListener = listener; 
    } 
    @Override 
    protected Void doInBackground(Context... params) { 

       ..... 

    final Integer id = ... 
    mListener.onCompleted(id); 

    return null; 
    } 
} 

其中

public interface ERPListener{ 
    public void onCompleted(int id); 
} 

當您創建異步任務,你所提供的任務完成時將要執行的監聽器。它提供了你需要的id給調用線程。