Android 学习日志(5) 线程

本文详细探讨了Android服务组件的创建、启动、生命周期及其在后台任务处理中的应用。通过一个具体的例子,展示了如何使用自定义线程进行周期性任务处理,并确保线程的安全性和稳定性。此外,还介绍了服务组件的各种回调方法,如onStartCommand、onBind等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package com.example.test;

import android.app.Service;
import android.content.Intent;
import android.content.res.Configuration;
import android.os.IBinder;
import android.util.Log;
import java.util.concurrent.locks.ReentrantLock;

//Log.d -- 在两条线程一起调用时基本没有出现乱码及其他问题  所以应该是线程安全的

public class MyTestService extends Service {

	public class MyThread extends Thread 
	{
		final private String Tag = "MyThread";
		private ReentrantLock m_ThreadLocker = new ReentrantLock();
		private boolean m_IsStopping = true;

		private int taskCount = 10;
		MyThread(String threadName)
		{
			super(threadName);	
		}
	
		@Override
		public void run()
		{
			setStopped(false);
			while (true)
			{
				if (isStoped())
					break;
				//do task...
	
				try 
				{
					Log.d(Tag, "Begin handle tasks...");
					while (taskCount > 0)
					{
						Thread.currentThread().sleep(16);
						Log.d(Tag, "Running Tasks..." + taskCount--);
					}
					Log.d(Tag, "Ended handle tasks...");

					if (taskCount == 0 && !isStoped())
						taskCount = 10;
				} 
				catch (InterruptedException e) 
				{
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
	
		}
	
		public void terminate(boolean wait_for_last_task_finish)
		{
			if (isStoped())
				Log.d(Tag, "Already Stopped!");

			setStopped(true);

			if (wait_for_last_task_finish)
			{
				try 
				{
					waitForTask();
				} 
				catch (InterruptedException e) 
				{
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}

			Log.d(Tag, "Try Yield Thread");
			yield();
			Log.d(Tag, "Thread Yield...");
		}
		
	
		public boolean isStoped()
		{
			boolean ret = false;
			m_ThreadLocker.lock();
			ret = m_IsStopping;
			m_ThreadLocker.unlock();
			return ret;
		}
	
		private void waitForTask() throws InterruptedException
		{
			taskCount = 500;
			this.join();
		}
	
		private void setStopped(boolean stop)
		{
			m_ThreadLocker.lock();
			m_IsStopping = stop;
			m_ThreadLocker.unlock();
		}
	}

	static String Tag = "[MyTestService] : ";
	private final MyThread m_ServiceRunnable = new MyThread("MyTestServiceRunnable");

	@Override
	public void onCreate()
	{
		OutLog("onCreate");
		super.onCreate();
		doTasks();
	}

	//Methods//
	public void doTasks()
	{
		OutLog(Thread.currentThread().getName());
		m_ServiceRunnable.start();
		
		int i = 100;
		while (true)
		{
			try {
				Thread.currentThread().sleep(16);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

			if (i-- > 0)
				OutLog("doTasks..." + i);

			if (i < 0 && !m_ServiceRunnable.isStoped())
				m_ServiceRunnable.terminate(true);
		}

	}

	//可传入空
	@Override
	public IBinder onBind(Intent intent) 
	{
		// TODO Auto-generated method stub
		OutLog("OnBind");
		return null;
	}
	
	/*
	 *      START_STICKY_COMPATIBILITY = 0
            START_STICKY = 1
            START_NOT_STICKY = 2
            START_REDELIVER_INTENT = 3
	 * */
	@Override
	public int onStartCommand(Intent intent, int flags, int startId)
	{
		int ret = super.onStartCommand(intent, flags, startId);
		OutLog("onStartCommand : flag = [" + flags + "] startId = [" + startId + "]" + " return = [" + ret + "]");
		return ret;
	}
	
	@Override
	public void onStart(Intent intent, int startId)
	{
		OutLog("onStart");
		super.onStart(intent, startId);
	}
	
	@Override
    public void onDestroy() 
	{
		OutLog("onDestroy");
		super.onDestroy();
    }
	
	@Override
    public void onConfigurationChanged(Configuration newConfig) 
	{
		OutLog("onConfigurationChanged");
		super.onConfigurationChanged(newConfig);
    }
    
	@Override
    public void onLowMemory() 
	{
		OutLog("onLowMemory");
		super.onLowMemory();
    }
	
	@Override
    public void onTrimMemory(int level) 
	{
		OutLog("onTrimMemory");
		super.onTrimMemory(level);
    }

	
    public boolean onUnbind(Intent intent) 
    {
    	OutLog("onUnbind");
        return super.onUnbind(intent);
    }

    public void onRebind(Intent intent) 
    {
    	OutLog("onRebind");
    	super.onRebind(intent);
    }
    

    public void onTaskRemoved(Intent rootIntent) 
    {
    	OutLog("onTaskRemoved");
    	super.onTaskRemoved(rootIntent);
    }
    
    private void OutLog(String str)
    {
    	Log.d(Tag, str);
    }

}

 

设计并实现一个动态整型数组类Vect,要求: (1)实现构造函数重载,可以根据指定的元素个数动态创建初始值为0的整型数组,或根据指定的内置整型数组动态创建整型数组。 (2)设计拷贝构造函数和析构函数,注意使用深拷贝。 (3)设计存取指定位置的数组元素的公有成员函数,并进行下标越界,若越界则输出“out of boundary”。 (4)设计获取数组元素个数的公有成员函数。 (5)设计用于输出数组元素的公有成员函数,元素之间以空格分隔,最后以换行符结束。 在main函数中按以下顺序操作: (1)根据内置的静态整型数组{1,2,3,4,5}构造数组对象v1,根据输入的整型数构造数组对象v2。 (2)调用Vect的成员函数依次输出v1和v2的所有元素。 (3)输入指定的下标及对应的整型数,设置数组对象v1的指定元素。 (4)根据数组对象v1拷贝构造数组对象v3。 (5)调用Vect的成员函数依次输出v1和v3的所有元素。 设计并实现一个动态整型数组类Vect,要求: (1)实现构造函数重载,可以根据指定的元素个数动态创建初始值为0的整型数组,或根据指定的内置整型数组动态创建整型数组。 (2)设计拷贝构造函数和析构函数,注意使用深拷贝。 (3)设计存取指定位置的数组元素的公有成员函数,并进行下标越界,若越界则输出“out of boundary”。 (4)设计获取数组元素个数的公有成员函数。 (5)设计用于输出数组元素的公有成员函数,元素之间以空格分隔,最后以换行符结束。 在main函数中按以下顺序操作: (1)根据内置的静态整型数组{1,2,3,4,5}构造数组对象v1,根据输入的整型数构造数组对象v2。 (2)调用Vect的成员函数依次输出v1和v2的所有元素。 (3)输入指定的下标及对应的整型数,设置数组对象v1的指定元素。 (4)根据数组对象v1拷贝构造数组对象v3。 (5)调用Vect的成员函数依次输出v1和v3的所有元素。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值