[Android]Thread线程入门1

原创 2013年12月06日 10:14:34

在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>
源代码如下:
public class TestThreadActivity extends Activity {
   private Handler mHandler;
   private TextView mTextView;
   private Button mButton;
   
   @Override
   public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.main);
       
       mTextView = (TextView)findViewById(R.id.txtShow);
       mButton = (Button)findViewById(R.id.btnTest);
       
       mButton.setOnClickListener(new View.OnClickListener() {
           
           public void onClick(View v) {
               startThread();
           }
       });
   }
   
   private void startThread()
   {    
       mHandler = new Handler();
        //1秒刷新一次
       
mHandler.postDelayed(changeText, 1000);
   }
   
   private Runnable changeText = new Runnable() {
       public void run()
       {
           mTextView.setText("This is a thread example.");
       }
   };
   
}
这就是一个简单的线程例子了。
二、如何释放线程。
很简单。调用removeCallbacks就可以了。源代码如下:
@Override
public void onDestroy()
{
    if(mHandler != null)
    {
        try
        {
            mHandler.removeCallbacks(changeText);
        }
        catch(Exception e)
        {
            //do nothing, don't crash
        }
    }
    super.onDestroy();
}
 
三、Thread+Message+Handler实现同样效果
和上面同样的效果。点击按钮后,改变文字。Layout不变,源代码如下:
public class TestThreadActivity extends Activity {
   private Handler mHandler;
   private TextView mTextView;
   private Button mButton;
   
   @Override
   public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.main);
       
       mTextView = (TextView)findViewById(R.id.txtShow);
       mButton = (Button)findViewById(R.id.btnTest);
       
       mButton.setOnClickListener(new View.OnClickListener() {            
           public void onClick(View v) {                
               TestMessageThread thread = new TestMessageThread();
               thread.start();
               
               mHandler = new Handler()
               {
                   @Override
                   public void handleMessage(Message msg)
                   {
                       mTextView.setText((msg.obj).toString());
                   }
               };
           }
       });
   }
   
   private class TestMessageThread extends Thread
   {
       @Override
       public void run()
       {
           //do something
           Message msg = new Message();
           msg.obj = "This is a thread example.";
           //send message
           mHandler.sendMessage(msg);
       }
   }
}

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

 private Handler mHandler = null;;
   private TestMessageThread mThread = null;
   private TextView mTextView;
   private Button mButton;
   
   @Override
   public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.main);
       
       mTextView = (TextView)findViewById(R.id.txtShow);
       mButton = (Button)findViewById(R.id.btnTest);
       
       mButton.setOnClickListener(new View.OnClickListener() {
           
           public void onClick(View v) {
               //startThread();
               mThread = new TestMessageThread();
               mThread.start();
               
               mHandler = new Handler()
               {
                   @Override
                   public void handleMessage(Message msg)
                   {
                       mTextView.setText((msg.obj).toString());
                   }
               };
           }
       });
   }
   
   @Override
   public void onDestroy()
   {
       super.onDestroy();
       if(mThread != null)
       {
           try
           {
               mThread.interrupt();                
           }
           catch(Exception e)
           {
               //do nothing, don't crash
           }
       }
   }
   
   private class TestMessageThread extends Thread
   {
       @Override
       public void run()
       {
           //do something
           Message msg = new Message();
           msg.obj = "This is a thread example.";
           //send message
           mHandler.sendMessage(msg);
       }
   }  
}

Android正确关闭线程

一般不使用这种方法关闭线程,Thread.interrupt() 较暴力,虽然进行 mThread.interrupt(); mThread = null; 终止了线程,但查看源码我们发现: in...
  • zhangty0223
  • zhangty0223
  • 2016年01月18日 12:38
  • 13067

Android销毁线程的方式

Android开发中,经常会用到线程和Timer,如果没有主动关闭它们,当程序结束时,线程并没有被销毁,而是一直在后台运行着,当我们重新启动应用时,又会重新启动一个线程,周而复始,你启动应用次数越多,...
  • yangxi_001
  • yangxi_001
  • 2014年02月24日 16:59
  • 2546

Android线程详解

现在大多数的移动设备已经变得越来越快,但是它们其实也不算是非常快。如果你想让你的APP既可以承受一些繁杂的工作而又不影响用户体验的话,那么必须把任务并行执行。在Android上,我们使用线程。 端一...
  • cswhale
  • cswhale
  • 2014年09月04日 15:54
  • 20500

Thread、Runnable以及线程的生命周期

首先 Thread是类,Runable是接口。 线程的起动并不是简单的调用了你的RUN方法,而是由一个线程调度器来分别调用你的所有线程的RUN方法, 我们普通的RUN方法如果没有执行完是不会返回的,也...
  • rabbit_in_android
  • rabbit_in_android
  • 2015年11月21日 14:54
  • 3268

在Android中使用HandlerThread创建线程

在android开发中,一说起线程的使用,很多人马上想到new Thread(){...}.start()这种方式。 这样使用当然可以,但是多次使用这种方式,会创建多个匿名线程。使得程序运行起来越来...
  • linghu_java
  • linghu_java
  • 2014年05月08日 15:53
  • 2529

在创建线程时,必须要建立一个Thread类的或其子类的实例

本文讲述在学习Java多线程中需要学习的向线程传递数据的三种方法。由于线程的运行和结束是不可预料的,因此,在传递和返回数据时就无法象函数一样通过函数参数和return语句来返回数据。 ...
  • xuxiang520010
  • xuxiang520010
  • 2016年01月15日 19:39
  • 538

继承Thread类创建多线程

package 多线程; public class 继承Thread开启多线程 { public static void main(String[] args) { MyThread...
  • Hellotanbin
  • Hellotanbin
  • 2015年09月24日 20:44
  • 1546

Java两个线程轮换打印1-100内的奇数和偶数

问题:   两个线程,一个打印1-100的奇数,一个打印1-100的偶数;要求:线程1打印5个之后,线程2开始打印,线程2打印5个之后,线程1再开始打印,以此循环。  public cla...
  • fengqiaoyebo2008
  • fengqiaoyebo2008
  • 2013年01月31日 15:43
  • 9415

Java(Android)线程池,介绍new Thread的弊端及Java四种线程池的使用

1.new Thread的弊端 执行一个异步任务你还只是如下new Thread吗? new Thread(new Runnable() {       @Ove...
  • xiaozhou_chen
  • xiaozhou_chen
  • 2014年11月26日 11:06
  • 1134

Android开发之多线程的操作方式Thread,TimerTask,AsyncTask

Android游戏开发之多线程的操作方式 雨松MOMO原创文章如转载,请注明:转载至我的独立域名博客雨松MOMO程序研究院,原文地址:http://www.xuanyusong....
  • u011470899
  • u011470899
  • 2013年08月22日 10:35
  • 1480
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[Android]Thread线程入门1
举报原因:
原因补充:

(最多只允许输入30个字)