android - android 中的 CountDownLatch 问题

标签 android countdownlatch

我正在使用 countdownlatch,如下例所示。此处 BackgroundDataPopulator 创建了一个 AyncTask,后者又调用 PackagePopulator 中的 displayData。但它永远不会发生并且 Activity 陷入困境。我在这里做错了什么。

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());
}

最佳答案

目前尚不清楚您到底在做什么以及 AscynTask 的启动位置。看起来您正在同一线程上调用 await()countDown(),这就是您被阻止的原因。发布更多详细信息和/或调试您的代码。

关于android - android 中的 CountDownLatch 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10678882/

相关文章:

Android 多行 TextView,检查文本是否适合,或者检查 TextView 是否已满

android - 如何使用 android 数据绑定(bind)动态更改 View 可见性

java - 使用 countDownLatch 更新两个或多个 ProgressBar

javascript - Android Webview触摸内容

java - 我如何将文件从 sdcard 上传到 Android 中的 SFTP 服务器?

android - EditText 截断文本

java - 使用循环屏障不会等到所有线程完成

Java并发: Modifying latch/ThreadGroup to achieve Executor behaviour

java - 使用AtomicInteger和CountDownLatch生成一个实例

java - CountDownLatch等待方法问题: doesn't throw on timeout