2012-05-21 5 views
1

아래 예와 같이 countdownlatch를 사용하고 있습니다. 여기에서 BackgroundDataPopulator는 AyncTask를 생성하며,이 AyncTask는 PackagePopulator의 displayData를 호출합니다. 그러나 결코 일어나지 않으며 활동은 붙어 얻는다. 내가 여기서 잘못하고있는 것은 무엇인가.android에서 CountDownLatch 문제가 발생했습니다.

public class PackagePopulator implements ServerDataProcessor { 

    private CountDownLatch counter=new CountDownLatch(1); 
    String[] packages; 

    public void getPagesFromServer() { 
     new BackgroundDataPopulator(IMgrApplication.getAppContext().getString(R.string.list),new PData(),this).execute(); 

    } 

    public String[] getPages() { 
     try { 

      counter.await(); 
     } catch (InterruptedException e) { 
      packages=new String[0]; 
     } 
     return packages; 
    } 

    @Override 
    public void displayData(ServerOutput output) { 


     Page[] pgArray = new Page[((PageData)output).getPages().size()]; 
     pages=new String[pgArray.length]; 
     pgArray = ((PageData)output).getPages().toArray(pgArray); 
     for(int i=0;i<pgArray.length;i++){ 
      pages[i]=pgArray[i].getName(); 
     } 
     counter.countDown(); 

    } 

} 





public class BackgroundDataPopulator extends AsyncTask<Void, String, ServerOutput> { 
    // connector=new JSONConnector(); 
    Connector connector; 
    String curUrl; 
    ServerOutput curServerOutput; 
    ServerDataProcessor processor; 


    public BackgroundDataPopulator(String url, ServerOutput serverOutput,ServerDataProcessor curProcessor) { 
     //connector = new UnitTestConnector(); 
     connector = new JSONConnector(); 
     curUrl = url; 
     curServerOutput = serverOutput; 
     processor=curProcessor; 
    } 

    @Override 
    protected ServerOutput doInBackground(Void... params) { 

     return connector.getData(URLUtils.getFormattedUrl(curUrl),curServerOutput); 
    } 

    @Override 
    protected void onPostExecute(ServerOutput output) { 
     processor.displayData(output); 
     //Toast.makeText(BaseFragmentActivity.this, "Done!",Toast.LENGTH_SHORT).show(); 
    } 
} 




protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    pagePopulator=new PagePopulator(); 
    pagePopulator.getPagesFromServer(); 
    super.onCreate(savedInstanceState); 

} 

public ArrayAdapter<CharSequence> getSpinnerDataArray(String item) { 
    return new ArrayAdapter<CharSequence>(this,android.R.layout.simple_spinner_item,pagePopulator.getPages()); 
} 

답변

1

정확히 무엇을하는지, 그리고 어디에서 AscynTask를 시작해야하는지 명확하지 않습니다. 같은 스레드에서 await()countDown()을 호출하는 것 같습니다. 그래서 차단되고있는 것입니다. 자세한 정보를 게시하거나 코드를 디버깅하십시오.

+0

backgroundtask에 실행할 코드를 약간 추가했습니다. 하지만 귀하의 질문에 대답하기 위해, onDataAndText 스레드에서 발생 된 asyncTask 스레드에 의해 displayData가 호출되고 있습니다. – sab

+0

누가 언제 PackagePopulator.getPages()를 호출합니까? –

+0

서버로부터 데이터를 얻기 위해 PackagePopulator를 사용하는 액티비티에 의해 호출되었습니다. 위의 코드를 편집했습니다. – sab

관련 문제