2015-08-20 255 views
-1

我有它在我的MainActivity類與ListView相關的,當我按清單(setOnItemClickListener法)的項目之一,我執行AsyncTask來檢索數據庫中的信息自定義適配器並將其發送到bundle同步不同步

因此,我必須等到AsyncTask完成才能發送在bundle中檢索到的信息。

爲此,我創建了一個interface

public interface OnCarListener { 

    void onCarCompleted(String c); 

    void onCarError(String error); 
} 

我有我的AsyncTask在另一大類:

class findCar extends AsyncTask<Integer, Integer, String> { 

    private final OnCarListener mListener; 

    public findCar(OnCarListener listener) 
    { 
     mListener = listener; 
    } 

    protected void onPreExecute() { 
    } 

    protected String doInBackground(Integer... idCar) { 

      String nameCar = ""; 

      //Here the code to retrive the info 

      nameCar = obj.getString("name"); 

      //Now nameCar = "Car1" 

     } catch (Exception ex) { 
     } 

     return nameCar; 
    } 

    protected void onProgressUpdate() { 
    } 

    protected void onPostExecute(String c) { 

     if (mListener != null) { 
      mListener.onCarCompleted(c); 
     } 
    } 
} 

我執行我AsyncTask(在我MainActivity)如下:

new findCar(new OnCarListener() 
{ 
    @Override 
    public void onCarCompleted(String c) { 

     synchronized (c) 
     { 
      name = c; 
     } 
    } 

    @Override 
    public void onCarError(String error) { 
    } 
}).execute(idCar); 

而且執行後納克AsyncTask我扔包:

bundle.putString("name", name); 

注:我與bundle發送的詳細信息,但我忽略它簡化問題。

應該在我看來,工作,但在Listname的一個元素第一次點擊是不是由bundle只是在第二和點擊其餘我在相同或發過去了,List的其餘元素中,它起作用。

預期的結果:AsyncTask將被執行,直到它完成代碼的其餘部分不應該工作。很明顯,這不是它現在正在做的事情。

我想知道的是:爲什麼​​在第一次迭代中不起作用?我的意思是,當我有List時,我點擊List其中一個元素顯示的元素信息(在另一個Activity中),但值name未顯示。

如果我回去,並且我在List的同一元素(或不同的元素)上做了一次或多次點擊,它們全都正確顯示值name

爲什麼在第一次迭代中它不起作用?

而且我還有一個問題:爲什麼如果我退出​​爲adelphus他回答說,任何我點擊List價值name出現的元素的時代?


我試過這個問題的解決方案:synchronized not synchronizing但仍然無法正常工作。

我該怎麼辦?(不改變程序的邏輯)

在此先感謝!

回答

1

我不確定你瞭解​​的作用 - 它創建一個給定對象的排他鎖,以創建對一段代碼的有序訪問。當多個線程嘗試進入同步塊(使用相同的鎖對象)時,一次只允許一個線程繼續進入塊。

在您的代碼中,您正在同步字符串參數c。由於沒有其他線程將訪問此參數,因此​​在此處不起作用。

由於您的界面回調函數被調用在UI線程(通過onPostExecute()),你可以在回調設置的束值:

void amethod() { 

    final Bundle bundle = new Bundle(); 
    new findCar(new OnCarListener() 
    { 
     @Override 
     public void onCarCompleted(String c) { 
      bundle.putString("name", c); 
     } 

     @Override 
     public void onCarError(String error) { 
     } 

    }).execute(idCar); 
} 
+0

現在,任何時代的我按在列表中的元素它存儲在包中的值「name」。 –

+0

根據你的回答,我嘗試同步我的'bundle',因爲它似乎試圖在它發送的包中插入新的值,但我得到的錯誤與你的情況相同。任何時間發送的名稱。 –

+0

您的問題是要解決在第一個項目被點擊時將值放入包** ** - 這就是代碼的作用。是的,它也會替換名稱,只要你點擊一個項目 - 但我不知道你是如何使用你的包,或你在哪裏/如何發送它。 – adelphus