Thread Blocks During Call

Posted by user578875 on Stack Overflow See other posts from Stack Overflow or by user578875
Published on 2011-01-17T18:50:05Z Indexed on 2011/01/17 18:53 UTC
Read the original article Hit count: 262

I have a serious problem, I'm developing an application that mesures on call time during a call; the problem presents when, with the phone on the ear, the thread that the timer has, blocks and no longer responds before taking off my ear. The next log shows the problem.

01-11 16:14:19.607 14558 14566 I Estado : postDelayed Async Service

01-11 16:14:20.607 14558 14566 I Estado : postDelayed Async Service

01-11 16:14:21.607 14558 14566 I Estado : postDelayed Async Service

01-11 16:14:22.597 14558 14566 I Estado : postDelayed Async Service

01-11 16:14:23.608 14558 14566 I Estado : postDelayed Async Service

01-11 16:14:24.017 1106 1106 D iddd : select() < 0, Probably a handled signal: Interrupted system call

01-11 16:14:24.607 14558 14566 I Estado : postDelayed Async Service

01-11 16:18:05.500 1106 1106 D iddd : select() < 0, Probably a handled signal: Interrupted system call

01-11 16:18:06.026 14558 14566 I Estado : postDelayed Async Service

01-11 16:18:06.026 14558 14566 I Estado : postDelayed Async Service

01-11 16:18:06.026 14558 14566 I Estado : postDelayed Async Service

01-11 16:18:06.026 14558 14566 I Estado : postDelayed Async Service

01-11 16:18:06.026 14558 14566 I Estado : postDelayed Async Service

01-11 16:18:06.026 14558 14566 I Estado : postDelayed Async Service

I've been trying with Services, Timers, Threads, AyncTasks and they all present the same problem.

My Code:

@Override
public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);     
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,     
      WindowManager.LayoutParams.FLAG_FULLSCREEN);        
    setContentView(R.layout.main); 

HangUpService.setMainActivity(this); objHangUpService = new Intent(this, HangUpService.class);

 Runnable rAccion = new Runnable() {
  public void run() {
      TelephonyManager tm = (TelephonyManager)getSystemService(TELEPHONY_SERVICE);
      tm.listen(mPhoneListener, PhoneStateListener.LISTEN_CALL_STATE);

      objVibrator = (Vibrator) getSystemService(getApplicationContext().VIBRATOR_SERVICE);

      final ListView lstLlamadas = (ListView) findViewById(R.id.lstFavoritos);
      final EditText txtMinutos = (EditText) findViewById(R.id.txtMinutos);
      final EditText txtSegundos = (EditText) findViewById(R.id.txtSegundos);

   ArrayList<Contacto> cContactos = new ArrayList<Contacto>();
      ContactoAdapter caContactos = new ContactoAdapter(HangUp.this, R.layout.row,cContactos);

      Cursor curContactos =  getContentResolver().query(
        ContactsContract.Contacts.CONTENT_URI,
        null,
        null,
        null,
        ContactsContract.Contacts.TIMES_CONTACTED + " DESC");

      while (curContactos.moveToNext()){

    String strNombre = curContactos.getString(curContactos.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
    String strID = curContactos.getString(curContactos.getColumnIndex(ContactsContract.Contacts._ID));
    String strHasPhone=curContactos.getString(curContactos.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER));
    String strStarred=curContactos.getString(curContactos.getColumnIndex(ContactsContract.Contacts.STARRED));

       if (Integer.parseInt(strHasPhone) > 0 && Integer.parseInt(strStarred) ==1 ) {

        Cursor CursorTelefono = getContentResolver().query(
              ContactsContract.CommonDataKinds.Phone.CONTENT_URI, 
              null, 
              ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = " + strID, 
              null, null);

        while (CursorTelefono.moveToNext()) {

         String strTipo=CursorTelefono.getString(CursorTelefono.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE));
         String strTelefono=CursorTelefono.getString(CursorTelefono.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
         strNumero=strTelefono; 

         String args[]=new String[1];     
         args[0]=strNumero;

         Cursor CursorCallLog = getContentResolver().query(
             android.provider.CallLog.Calls.CONTENT_URI, 
             null, 
             android.provider.CallLog.Calls.NUMBER + "=?",
             args, 
             android.provider.CallLog.Calls.DATE+ " DESC");

         if (Integer.parseInt(strTipo)==2)
         {
             caContactos.add(
                 new Contacto(
                  strNombre,             
                  strTelefono
                 )
                );
         }
        }
        CursorTelefono.close();
       }
      } 
      curContactos.close();

      lstLlamadas.setAdapter(caContactos);   
      lstLlamadas.setOnItemClickListener(new OnItemClickListener() {
      @Override
      public void onItemClick(AdapterView a, View v, int position, long id) {

       Contacto mContacto=(Contacto)lstLlamadas.getItemAtPosition(position);

       i = new Intent(HangUp.this, Llamada.class);

       Log.i("Estado","Declaro Intent");
       Bundle bundle = new Bundle();    
       bundle.putString("telefono", mContacto.getTelefono());
       i.putExtras(bundle);
       startActivityForResult(i,SUB_ACTIVITY_ID);                  
       Log.i("Estado","Inicio Intent");
       blActivo=true;

       try {

            String strMinutos=txtMinutos.getText().toString();
            String strSegundos=txtSegundos.getText().toString();

            if(!strMinutos.equals("") && !strSegundos.equals("")){

             int Tiempo = (
               (Integer.parseInt(txtMinutos.getText().toString())*60) + 
               Integer.parseInt(txtSegundos.getText().toString()) 
              )* 1000;

             handler.removeCallbacks(rVibrate);
             cTime = System.currentTimeMillis();
             cTime=cTime+Tiempo;

             objHangUpAsync = new HangUpAsync(cTime,objVibrator,objPowerManager,objKeyguardLock);
             objHangUpAsync.execute();

             objPowerManager.userActivity(Tiempo+3000, true);
             objHangUpService.putExtra("cTime", cTime);

//startService(objHangUpService);

       } catch (Exception e) {
        e.printStackTrace();
       } finally {

       }
      }
      });
     }
 };
}        

AsyncTask:

@Override protected String doInBackground(String... arg0) {

blActivo = true;

mWakeLock = objPowerManager.newWakeLock(PowerManager.FULL_WAKE_LOCK, "My Tag"); objKeyguardLock.disableKeyguard(); Log.i("Estado", "Entro a doInBackground");

timer.scheduleAtFixedRate( new TimerTask() { public void run() { if (blActivo){ if (cTime

  blActivo=false;
  objVibrator.vibrate(1000);
  Log.i("Estado","Vibrar desde Async");
  this.cancel();

 }else{
  try{
    mWakeLock.acquire();                   
    mWakeLock.release();

Log.i("Estado","postDelayed Async Service"); }catch(Exception e){ Log.i("Estado","Error: " + e.getMessage()); } } } } }, 0, INTERVAL); return null; }

© Stack Overflow or respective owner

Related posts about android

Related posts about multithreading