我需要主线程等待在后台运行的服务的结果

时间:2012-07-27 10:10:41

标签: android android-service

我的程序有问题,当我运行程序时,我需要进行2次迭代来更新一个名为“existe”的变量。我使用处理程序进行此更新。 我认为是同步问题,但我不知道它在哪里。 我有1个broadcastreceiber,它重新调整了服务方法的响应,但我认为首先是它完成了按钮处理程序代码,后来它正在运行broadcastreceiber。 虽然我认为broadcastreceiber应该在recibe时运行方法服务的响应? 谢谢你的帮助。

这是按钮处理程序的代码:

View.OnClickListener buttonhandler=new View.OnClickListener(){ 

    public void onClick(View v) {
        EditText id_camarero = (EditText) findViewById(R.id.id_camarero);
        String numero = id_camarero.getText().toString();
        if( numero.trim().equals("")){
             AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(context);

            // set title
            alertDialogBuilder.setTitle("Fallo de id");

            // set dialog message
            alertDialogBuilder
                //.setMessage("Click salir para finalizarprograma")
                .setCancelable(false)
                .setPositiveButton("Salir",new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog,int id) {
                        // if this button is clicked, close
                        // current activity
                        MainActivity.this.finish();
                    }
                  })
                .setNegativeButton("Reintentar",new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog,int id) {
                        // if this button is clicked, just close
                        // the dialog box and do nothing
                        dialog.cancel();
                    }
                });

                // create alert dialog
                AlertDialog alertDialog = alertDialogBuilder.create();

                // show it
                alertDialog.show();


        }
         idcamarero=Integer.parseInt(numero);
         comprobacion();
         //IntentFilter filter = new IntentFilter(MyService.DATA_RECEIVED_INTENT);
        // registerReceiver(androidListener, filter);
     if((existe==false)){
         AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(context);

                // set title
                alertDialogBuilder.setTitle("Fallo de id");

                // set dialog message
                alertDialogBuilder
                    //.setMessage("Click salir para finalizarprograma")
                    .setCancelable(false)
                    .setPositiveButton("Salir",new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog,int id) {
                            // if this button is clicked, close
                            // current activity
                            MainActivity.this.finish();
                        }
                      })
                    .setNegativeButton("Reintentar",new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog,int id) {
                            // if this button is clicked, just close
                            // the dialog box and do nothing
                            dialog.cancel();
                        }
                    });

                    // create alert dialog
                    AlertDialog alertDialog = alertDialogBuilder.create();

                    // show it
                    alertDialog.show();
                }

     else{
    // Intent intent= new Intent(GestorRestauranteActivity.this,MenuMesas.class);
    // intent.putExtra("id", numero);//enviamos el id de camarero a la actividad que invocamos
    // startActivity(intent);
     finish();
     }
    }

};

这是broadcastreceiber的代码:

 BroadcastReceiver androidListener = new BroadcastReceiver()

{
@Override

    public void onReceive(Context context, Intent intent) 

    {
        if (intent.getAction().equals(MyService.DATA_RECEIVED_INTENT))
        {               
            Message msg = Message.obtain();
            msg.obj = intent.getExtras().get("text");

            msg.setTarget(cEmiHandler);
            msg.sendToTarget();                     
        }
    }
};

1 个答案:

答案 0 :(得分:0)

不要让它变得那么复杂,简单的解决方法是使用Object类的wait(),notify()方法。 在主线程中,您通过wait()方法锁定对象,在另一个线程中(工作线程执行主作业),在作业完成时使用notify(),主线程将被解锁并继续。

Object x = new Object();

在主线程中:x.wait(); 在工作线程中:完成工作然后x.notify();

相关问题