立即从android中的非UI线程更新UI

时间:2014-05-05 13:08:32

标签: android android-layout android-intent thread-safety handler

我有一个活动,其中两个微调器从数据库中填充。第二个微调器值取决于第一个微调器的选定值。我有以下代码:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
    requestWindowFeature(Window.FEATURE_PROGRESS);
    setContentView(R.layout.calculation_options);
    setProgressBarIndeterminateVisibility(true);
    setProgressBarVisibility(true);

    progressCalcualtionOptions = new ProgressDialog(this);

    spinner1 = (Spinner) findViewById(R.id.spinner1);
    spinner2 = (Spinner) findViewById(R.id.spinner2);
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onResume();
    try {
        progressCalcualtionOptions = ProgressDialog.show(
                context,
                Constant.lblPleasewait,
                Constant.lblPleasewait,
                true
        );

        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    //fill first spinner
                    list1 = db.GetAll(); //get from db

                    //updating ui from no ui thread
                    handler.post(new Runnable() {
                        @Override
                        public void run() {
                            adapter1 = new Adapter(this,
                                    android.R.layout.simple_spinner_item,
                                    list1);
                            adapter1.setDropDownViewResource(android.R.layout.simple_spinner_item);
                            spinner1.setAdapter(adapter1);
                        }
                    });

                    //Second first spinner
                    list2 = db.GetAll2(spinner1.getSelectedItemPosition); //get from db

                    //updating ui from no ui thread
                    handler.post(new Runnable() {
                        @Override
                        public void run() {
                            adapter2 = new Adapter(this,
                                    android.R.layout.simple_spinner_item,
                                    list2);
                            adapter2.setDropDownViewResource(android.R.layout.simple_spinner_item);

                            adapter2.setAdapter(ddldescriptionAdapter);
                        }
                    });


                } catch (Exception e) {
                }
                if (progressCalcualtionOptions != null) {
                    progressCalcualtionOptions.dismiss();
                    progressCalcualtionOptions = null;
                }
            }
        }).start();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

在上面的代码中,我使用了自定义适配器来填充微调器和两个数据库函数来从数据库中获取记录。

现在问题就是:

我的第二个微调器正在使用spinner1的选定项目,我正在使用稍后将执行的handler.post()更新spinner1,因此我无法获得spinner1的正确选择值。它会给我-1 spinner1的值,因为当前spinner1不会在UI上更新,同时我的spinner2填充代码将被执行。

如何立即从非UI线程更新UI或如何管理这些内容?

1 个答案:

答案 0 :(得分:-1)

您可以使用runOnUiThread

runOnUiThread:在UI线程上运行指定的操作。如果当前线程是UI线程,则立即执行该操作。如果当前线程不是UI线程,则该操作将发布到UI线程的事件队列中。

编辑:

runOnUiThread(new Runnable() {

       adapter1= new Adapter(this,
                android.R.layout.simple_spinner_item,
                list1 );
      adapter1.setDropDownViewResource(android.R.layout.simple_spinner_item);

    spinner1.setAdapter(adapter1);  

    });