2012-07-16 74 views
0

訪問的AsyncTask定義的值我有這樣的代碼如何從一個活動

@Override 
public void onCreate(Bundle savedInstanceState) { 
    addItemsOnSpinnerOrgaLevel(); 

     btn_getReport.setOnClickListener(new OnClickListener() { 
    @Override 
    public void onClick(View v) { 

      //How can i access map and list defined in orgaLevelTask(AsyncTask)??? 
      Like 
      String option = parent.getItemAtPosition(pos).toString();    
      int orgaCode = orgaLevelMap.get(option); 

      // Both are defined in AsyncTask ?? 

    }); //end of anonymous class 

} //end of onCreate() 

public void addItemsOnSpinnerOrgaLevel() { 

    orgaLevelTask = new OrgaLevelTask(AccountReportActivity.this, spinner_orgaLevel, spinner_branch, txt_extra, txt_extra1);  
    orgaLevelTask.execute(); 

} //end of addItemsOnSpinnerOrgaLevel() 

在的AsyncTask onPostExecute()方法I具有

@Override 
protected void onPostExecute(ArrayList<OrgaLevel> result) {  
    super.onPostExecute(result);       
    if (result != null) {    
     addItemsOnSpinnerOrgaLevel(result);          
    } 
    dialog.dismiss(); 
} //end of onPostExecute() 

public void addItemsOnSpinnerOrgaLevel(ArrayList<OrgaLevel> result) { 

    orgaLevelElementslist = new ArrayList<String>(); 
    orgaLevelElementslist.add("All"); 
    orgaLevelMap = new HashMap<String, Integer>(); 
    orgaLevelMap.put("All", 0); 

    for (int i=0; i<result.size(); i++) { 

     OrgaLevel orgaLevelRecord = (OrgaLevel) result.get(i); 
     String key = orgaLevelRecord.getOrgaName(); 
     String value = orgaLevelRecord.getOrgaCode(); 

     orgaLevelMap.put(key, Integer.parseInt(value));    
     orgaLevelElementslist.add(key); 

    } //end of for() 

    ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(accountReportActivity, android.R.layout.simple_spinner_item, orgaLevelElementslist); 
    dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
    spinner_orgaLevel.setAdapter(dataAdapter); 

    setSpinnerOrgaLevelListener(); 

} //end of addItemsOnSpinnerOrgaLevel() 

private void setSpinnerOrgaLevelListener() { 

    spinner_orgaLevel.setOnItemSelectedListener(new OnItemSelectedListener() { 

     @Override 
     public void onItemSelected(AdapterView<?> parent, View view, int pos,long id) {    
      String option = parent.getItemAtPosition(pos).toString();    
      int orgaCode = orgaLevelMap.get(option);    
      subOrgaLevelTask = new SubOrgaLevelTask(accountReportActivity, spinner_branch, orgaCode);  
      subOrgaLevelTask.execute();    

     } //end of onItemSelected() 

    }); //end of anonymous class 

} //end of setSpinnerOrgaLevelListener() 

在subOrgaLevelTask​​我也有相同的散列映射就像這堂課一樣。你可以看到我想要做的是,把一個關鍵的價值放在微調。所以當我的btn_getReport按鈕得到點擊,然後我得到所選項目的值。就像所有被選中,然後我得到0等等。這個關鍵的價值是工作。問題是當btn_getReport得到點擊,然後我如何獲得所選項目的值。因爲我在後臺線程中填充項目(在OrgaLevelTask​​和SubOrgaLevelTask​​中),我的按鈕在Activity中。那麼我怎麼做,當按鈕點擊,然後我從OrgaLevelTask​​和SubOrgaLevelTask​​中定義的地圖的值?

感謝

回答

0

好,使他們在orgaLevelTask​​公衆,只需訪問它們。 orgaLevelTask​​應該是你activity類中的一個變量。你試過了嗎?任何錯誤?

您必須確保orgaLevelTask​​成員將在線程安全的方式,使它們公開,我可以訪問它訪問

+0

謝謝,但我怎麼能確保我的orgaLevelTask​​成員都是線程安全的嗎?我在我的活動'String orgaLevel = spinner_orgaLevel.getSelectedItem()。toString(); int orgaCode = orgaLevelTask​​.orgaLevelMap.get(orgaLevel);'''branch = spinner_branch.getSelectedItem()。toString(); int subOrgaCode = orgaLevelTask​​.subOrgaLevelTask​​.subOrgaLevelMap.get(branch);' – Basit 2012-07-17 05:12:47

+0

您不能讓GUI線程訪問可能在異步線程中創建/修改的集合。例如,您可以在doInBackground中填充臨時集合,並將其複製到onPostExecute的最終集合中。 – marcinj 2012-07-17 08:39:47

+0

嗯,我在做什麼是我的web服務返回我ArrayList。所以在返回列表之後,我在我的onPostExecute()方法中使用了類似這樣的內容:orgaLevelElementslist = new ArrayList (); orgaLevelElementslist.add(「All」); orgaLevelMap = new HashMap (); orgaLevelMap.put(「All」,0); for(int i = 0; i Basit 2012-07-17 10:17:34

相關問題