[Android]Thread线程入门1

来源:互联网 发布:程序员包装简历 编辑:程序博客网 时间:2024/06/08 06:54

在Android中Thread可是经常要用到的啊。

一、建立一个简单的Thread
初始界面如下:


点击Test按钮后,开启一个线程。这个线程,将“Hello World...”字符串修改成另外一个字符串。如下图所示。

布局文件如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="fill_parent"
   android:layout_height="fill_parent"
   android:orientation="vertical" >

   <TextView
      android:layout_width="fill_parent"
      android:layout_height="wrap_content"
      android:text="@string/hello"
      android:id="@+id/txtShow" />
   
   <Button android:id="@+id/btnTest"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Test" />
</LinearLayout>
源代码如下:
publicclassTestThreadActivityextendsActivity{
   privateHandlermHandler;
   privateTextViewmTextView;
   privateButton mButton;
   
   @Override
   publicvoidonCreate(BundlesavedInstanceState){
      super.onCreate(savedInstanceState);
      setContentView(R.layout.main);
      
      mTextView = (TextView)findViewById(R.id.txtShow);
      mButton = (Button)findViewById(R.id.btnTest);
      
      mButton.setOnClickListener(newView.OnClickListener(){
          
         publicvoidonClick(Viewv) {
             startThread();
         }
      });
   }
   
   privatevoidstartThread()
   {   
      mHandler = newHandler();
       //1秒刷新一次
      
mHandler.postDelayed(changeText,1000);
  }
  
  privateRunnable changeText = new Runnable() {
     publicvoid run()
     {
         mTextView.setText("Thisis a thread example.");
     }
  };
  
}
这就是一个简单的线程例子了。
二、如何释放线程。
很简单。调用removeCallbacks就可以了。源代码如下:
@Override
publicvoidonDestroy()
{
    if(mHandler!= null)
    {
       try
       {
          mHandler.removeCallbacks(changeText);
       }
       catch(Exceptione)
       {
          //do nothing, don't crash
       }
    }
    super.onDestroy();
}
 
三、Thread+Message+Handler实现同样效果
和上面同样的效果。点击按钮后,改变文字。Layout不变,源代码如下:
publicclassTestThreadActivityextendsActivity{
   privateHandlermHandler;
   privateTextViewmTextView;
   privateButton mButton;
   
   @Override
   publicvoidonCreate(BundlesavedInstanceState){
      super.onCreate(savedInstanceState);
      setContentView(R.layout.main);
      
      mTextView = (TextView)findViewById(R.id.txtShow);
      mButton = (Button)findViewById(R.id.btnTest);
      
      mButton.setOnClickListener(newView.OnClickListener(){          
         publicvoidonClick(Viewv) {             
             TestMessageThread thread = newTestMessageThread();
             thread.start();
             
             mHandler = newHandler()
             {
                @Override
                publicvoidhandleMessage(Messagemsg)
                {
                   mTextView.setText((msg.obj).toString());
                }
             };
         }
      });
   }
   
   privateclassTestMessageThreadextendsThread
   {
      @Override
      publicvoidrun()
      {
         //dosomething
         Messagemsg = newMessage();
         msg.obj= "This is a threadexample.";
         //sendmessage
         mHandler.sendMessage(msg);
      }
   }
}

如何释放这里用到的线程呢?这就要用到线程的interrupt函数了。源代码如下:publicclassTestThreadActivityextendsActivity{
 

 privateHandlermHandler= null;;
   privateTestMessageThreadmThread= null;
   privateTextViewmTextView;
   privateButton mButton;
   
   @Override
   publicvoidonCreate(BundlesavedInstanceState){
      super.onCreate(savedInstanceState);
      setContentView(R.layout.main);
      
      mTextView = (TextView)findViewById(R.id.txtShow);
      mButton = (Button)findViewById(R.id.btnTest);
      
      mButton.setOnClickListener(newView.OnClickListener(){
          
         publicvoidonClick(Viewv) {
             //startThread();
             mThread = newTestMessageThread();
             mThread.start();
             
             mHandler = newHandler()
             {
                @Override
                publicvoidhandleMessage(Messagemsg)
                {
                   mTextView.setText((msg.obj).toString());
                }
             };
         }
      });
   }
   
   @Override
   publicvoidonDestroy()
   {
      super.onDestroy();
      if(mThread!= null)
      {
         try
         {
             mThread.interrupt();             
         }
         catch(Exceptione)
         {
             //donothing, don't crash
         }
      }
   }
   
   privateclassTestMessageThreadextendsThread
   {
      @Override
      publicvoidrun()
      {
         //dosomething
         Messagemsg = newMessage();
         msg.obj= "This is a threadexample.";
         //sendmessage
         mHandler.sendMessage(msg);
      }
   }  
}
原创粉丝点击