线程
每个进程包含一个或多个线程。多数情况下,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);
}
### 最后
由于题目很多整理答案的工作量太大,所以仅限于提供知识点,详细的很多问题和参考答案我都整理成了 PDF文件
![](https://img-blog.csdnimg.cn/img_convert/1d55637621d3017985d7ef173af2d547.webp?x-oss-process=image/format,png)
![](https://img-blog.csdnimg.cn/img_convert/723eb1f1977eca6e3bec91875aa3458e.webp?x-oss-process=image/format,png)
![](https://img-blog.csdnimg.cn/img_convert/57da6c3d13d9edb95691791bc951e2c1.webp?x-oss-process=image/format,png)
加入社区》https://bbs.csdn.net/forums/4304bb5a486d4c3ab8389e65ecb71ac0
}
### 最后
由于题目很多整理答案的工作量太大,所以仅限于提供知识点,详细的很多问题和参考答案我都整理成了 PDF文件
[外链图片转存中...(img-yCuepqSn-1725758998321)]
[外链图片转存中...(img-fquVkJjg-1725758998321)]
[外链图片转存中...(img-R7jyXDTb-1725758998321)]
加入社区》https://bbs.csdn.net/forums/4304bb5a486d4c3ab8389e65ecb71ac0