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());
}
backgroundtask에 실행할 코드를 약간 추가했습니다. 하지만 귀하의 질문에 대답하기 위해, onDataAndText 스레드에서 발생 된 asyncTask 스레드에 의해 displayData가 호출되고 있습니다. – sab
누가 언제 PackagePopulator.getPages()를 호출합니까? –
서버로부터 데이터를 얻기 위해 PackagePopulator를 사용하는 액티비티에 의해 호출되었습니다. 위의 코드를 편집했습니다. – sab