2010-10-17 8 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 relativo al thread Android, perché ancora blocchi quando ho utilizzato un thread di lavoro?

Sono veramente confusa a tale proposito ...

risposta

38

È necessario chiamare start() non eseguire().

Chiamando run() nel thread principale, ci si sta bloccando proprio come qualsiasi normale chiamata di metodo.

+1

Spiacente ho modificato che rispondere ad alcune volte cercando di capire come c'è molto da dire o no. Alla fine ho deciso di commentare solo la risposta. In bocca al lupo. – eSniff

+0

mi hai salvato la vita: | Stavo cercando di uccidermi per quello. –

0

provare questo codice

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