zoukankan      html  css  js  c++  java
  • Android项目——实现时间线程源码

    进程
      在Android
    中,进程是应用程序的完整实现,而不是用户通常了解的那样。他们主要用途很简单:

      提高稳定性和安全性,将不信任或者不稳定的代码移动到其他进程。

      可将多个.apk 包运行在同一个进程里减少系统开销。

      帮助系统管理资源,将重要的代码放在一个单独的进程里,这样就可以单独销毁应用程序的其他部分。

      像前面描述的一样,进程的属性被用来控制那些有特殊应用组件运行的进程。注意这个属性不能违反系统安全: 如果两个.apk
    包不能共享同一个用户ID,却试图运行在通一个进程里,这种情况是不被允许的,事实上系统将会创建两个不同的进程。请查看安全相关文档以获取更多关于安全限制方面的信息。


      线程

      每个进程包含一个或多个线程。多数情况下,Android
    避免在进程里创建多余的线程,除非它创建它自己的线程,我们应保持应用程序的单线程性。一个重要的结论就是所有呼叫实例, 广播接收器,
    以及服务的实例都是由这个进程里运行的主线程创建的。注意新的线程不是为活动,广播接收器,服务或者内容提供器实例创建:这些应用程序的组件在进程里被实例化(除非另有说明,都在同一个进程处理),实际上是进程的主线程。这说明当系统调用时这些组件(包括服务)不需要进程远距离或者封锁操作(就像网络呼叫或者计算循环),因为这将阻止进程中的所有其他组件。你可以使用标准的线程类或者Android
    的HandlerThread 类去对其它线程执行远程操作。这里有一些关于创建线程规则的例外:


      呼叫IBinder 或者IBinder 实现的接口,如果该呼叫来自其他进程,你可以通过线程发送的IBinder
    或者本地进程中的线程池呼叫它们,从进程的主线程呼叫是不可以的。特殊情况下,,呼叫一个服务的IBinder可以这样处理。(虽然在服务里呼叫方法在主线程里已经完成。)这意味着IBinder
    接口的实现必须要有一种线程安全的方法,这样任意线程才能同时访问它。


      呼叫由正在被调用的线程或者主线程以及IBinder
    派发的内容提供器的主方法。被指定的方法在内容提供器的类里有记录。这意味着实现这些方法必须要有一种线程安全的模式,这样任意其它线程同时可以访问它。


      呼叫视图以及由视图里正在运行的线程组成的子类。通常情况下,这会被作为进程的主线程,如果你创建一个线程并显示一个窗口,那么继承的窗口视图将从那个线程里启动

    網上看了一些例子,有高手們是直接新建一個類,然後繼承Thread之生重寫run方法,這個項目我將采用第二種寫法,就是繼承直接用Activity去繼承implements
    Runnable如:public class testAnalogClock extends Activity implements
    Runnable  ,之后我們只要重寫Runnable的實現方法就可以做到同樣的效果。因為網上有很多相似功能,具體代碼將不做過多解釋,我會在項目上一一做注釋,源碼如下:

    package cn.terry; 
      
      
    import java.util.Calendar; 
         
    import android.app.Activity;   
    import android.graphics.Color;   
    import android.os.Bundle;  
    import android.os.Handler;  
    import android.os.Message;  
    import android.widget.*; 
      
    //使用线程实现的TextView 时钟需要线程Thread、Handler(发送、处理消息)辅助实现 
      
    public
      
    class testAnalogClock extends Activity implements Runnable{ 
      
        private AnalogClock myAnalogClock; 
      
        private TextView myTextView; 
      
        private Thread mThread; 
      
        private Handler myHandler; 
      
        private Calendar myCalendar;  //日曆類 
       
    protected static final int msg_Key = 0x1234; 
      
     private  int mHour, mMinutest,mScond; 
      
        /** Called when the activity is first created. */
      
        @Override
      
        public
      
    void onCreate(Bundle savedInstanceState) { 
      
                 
            super.onCreate(savedInstanceState); 
      
            setContentView(R.layout.main); 
      
            //模拟时钟的实现不需要额外代码,只需要UI 中添加,其自动显示时间 
      
            myAnalogClock=(AnalogClock)findViewById(R.id.AnalogClock01); 
      
            myTextView=(TextView)findViewById(R.id.TextView01); 
            
      
            /* 通过Handler 来接收进程所传递的信息并更新TextView */ 
      
            myHandler=new Handler() 
      
            { 
      
                @Override 
      
                public 
      
    void handleMessage(Message msg) { 
      
                    // TODO Auto-generated method stub 
        
    switch (msg.what) { 
      
                    case testAnalogClock.msg_Key: 
      
                        if(mMinutest==60) 
      
                        { 
      
                            mHour+=1; 
      
                            mMinutest=0; 
      
                        } 
      
                        if(mScond==60) 
      
                        { 
      
                            mMinutest+=1; 
      
                        } 
      
                        /* 在这处理要TextView对象Show时间的事件*/ 
      
                        myTextView.setText(" 
      
    "+mHour+":"+mMinutest+":"+mScond); 
      
                        myTextView.setTextColor(Color.RED); 
      
                        break; 
        
      
                    default: 
      
                        break; 
      
                    } 
      
                    super.handleMessage(msg); 
      
                } 
      
            }; 
      
            /* 通过进程来持续取得系统时间*/ 
      
            mThread=new Thread(this); 
      
            mThread.start(); 
                
        } 
      
        /* 实现一个Runable接口,实例化一个进程对象, 用来持续取得系统时间*/ 
      
        @Override 
      
        public 
      
    void run() { 
      
            // TODO Auto-generated method stub 
      
    try {   
                do 
      
                { 
      
                    long Time=System.currentTimeMillis(); 
      
                    myCalendar=Calendar.getInstance(); 
      
                    myCalendar.setTimeInMillis(Time); 
      
                    mHour=myCalendar.get(Calendar.HOUR); 
      
                    mMinutest=myCalendar.get(Calendar.MINUTE); 
      
                    mScond=myCalendar.get(Calendar.SECOND); 
      
                    Thread.sleep(1000); 
      
                     
                    /* 重要关键程序:取得时间后发出信息给Handler */ 
      
                    Message msg=new Message();   
                    msg.what=testAnalogClock.msg_Key; 
                    myHandler.sendMessage(msg);/* 重要关键程序:取得时间后发出信息给Handler */ 
      
                }   
                while(Thread.interrupted()==false);/* 当系统发出中断信息时停止本循环*/
      
            } catch (Exception e) { 
      
                // TODO: handle exception   
                e.printStackTrace(); 
      
            } 
                  
        }          
    }
  • 相关阅读:
    最容易被淘汰的八种人
    java基础编程——用两个栈来实现一个队列
    java基础编程——重建二叉树
    java基础——多线程
    java基础编程——链表反转
    java基础——线程池
    java基础——线程
    java基础编程——二维数组中的查找
    网络编程——TCP协议和通信
    网络编程——UDP协议和通信
  • 原文地址:https://www.cnblogs.com/vus520/p/2561914.html
Copyright © 2011-2022 走看看