2010-10-17 11 views
11
package com.commonsware.android.threads; 

import android.app.Activity; 
import android.os.Bundle; 
import android.os.Handler; 
import android.os.Message; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.ProgressBar; 
import android.widget.TextView; 
import android.widget.Toast; 

public class HandlerDemo extends Activity { 
    Thread mBackground; 
    ProgressBar bar; 
    Handler handler = new Handler() { 
      @Override 
      public void handleMessage(Message msg) { 
        bar.incrementProgressBy(5); 
      } 
    }; 
    boolean isRunning = false; 

    @Override 
    public void onCreate(Bundle icicle) { 
      super.onCreate(icicle); 
      setContentView(R.layout.main); 
      bar = (ProgressBar) findViewById(R.id.progress); 
    } 

    public void onStart() { 
      super.onStart(); 
      bar.setProgress(0); 

      mBackground = new Thread(new Runnable() { 
        public void run() { 
          try { 
            int a = 0; 
            for (int i = 0; i < 20 && isRunning; i++) { 
              for (int j = 0; j < 2000; j++) { 
                for (int k = 0; k < 1000; k++) { 
                  a++; 
                } 
              } 
              handler.sendMessage(handler.obtainMessage()); 
            } 
          } catch (Throwable t) { 
            // just end the background thread 
          } 
        } 
      }); 

      findViewById(R.id.LoginButton).setOnClickListener(
          new OnClickListener() { 
            public void onClick(View v) { 
              mBackground.run(); 
            } 
          }); 

      isRunning = true; 

    } 

    public void onStop() { 
      super.onStop(); 
      isRunning = false; 
    } 

}Problema con el hilo de Android, ¿por qué ui todavía bloquea cuando he usado un hilo de trabajo?

estoy muy confundida de eso ...

Respuesta

38

Es necesario llamar a start() no run().

public void onClick(View v) { 
     mBackground.start(); //Start will spawn the Thread and then call it's run method. 
} 

Al llamar a run() en el hilo principal, que no están bloqueando al igual que cualquier llamada al método normal.

+1

Lo siento, editado que contestar un par de veces tratando de encontrar la manera hay mucho que decir o no. Al final, decidí comentar solo la respuesta. Buena suerte. – eSniff

+0

me salvaste la vida: | Estaba intentando suicidarme por eso. –

0

tratar este código

private void showProgrssBar(){ 
pLayout.setVisibility(View.VISIBLE); 
final StringBuffer s=new StringBuffer(); 
final Thread progressThread=new Thread(){ 
    @Override 
    public void run(){ 


      while(CreateVideoService.processingFrame>1) { 
       inc=100-((CreateVideoService.processingFrame*100)/(CreateVideoService.numberofRecordedFrames)); 
       if(s.length()>0) 
       s.delete(0, s.length()); 
       s.append("Processing... ").append(inc).append("%"); 
       progressBarHandler.post(new Runnable() { 

        @Override 
        public void run() { 
         // TODO Auto-generated method stub 
         progressBar.setProgress(inc); 
         textProgrs.setText(s); 
        } 
       }); 
       //progressBar.setProgress(100-inc); 
       try { 
        // Sleep for 5 seconds 
        Thread.sleep(200); 
       } catch (InterruptedException e) { 
        //Log.d("TAG", "sleep failure"); 
       } 
      } 
      layoutHandler.post(new Runnable() { 

       @Override 
       public void run() { 
        // TODO Auto-generated method stub 
        pLayout.setVisibility(View.GONE); 
       } 
      }); 

    } 
}; 
progressThread.start(); 
} 
Cuestiones relacionadas