Android 开发中线程的分析

Android 开发中线程的分析

今天早上把公司给的任务做完了之后,突然就有点无聊,于是,把以前学的那些东西翻了翻,博客看了看,就看到一个关于线程的博客,有了很大的争议,我也差点误解了(感觉高大上~~~)。整体代码差不多是这样:

package sw.angel.thread;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
public class ThreadDemo extends Activity {
  private static final String TAG = "ThreadDemo";
  private int count = 0;
  private Handler mHandler = new Handler(); 

  private Runnable mRunnable = new Runnable() { 

    public void run() {
      //为了方便 查看,我们用Log打印出来
      Log.e(TAG, Thread.currentThread().getName() + " " +count);
      count++;
      setTitle("" +count);
      //每2秒执行一次
      mHandler.postDelayed(mRunnable, 2000);
    } 

  };
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    //通过Handler启动线程
    mHandler.post(mRunnable);
  } 

  protected void onDestroy() {
    //将线程销毁掉
    //mHandler.removeCallbacks(mRunnable);
    super.onDestroy();
  }
}

所谓的争议是什么呢?看了这块代码的大概意思,很多人会以为每2s新开一个线程执行,但程序退出时,线程依旧是执行的。博主就在onDestroy()中加上了removeCallbacks()。大概意思就是移除线程(销毁)。

当然,首先指出的一点就是,这个demo是每2秒执行一次Runable。相当于每2秒执行一次主线程,用logcat打印出来。而不是每2秒新开一个线程。而无论你是否加上最后一句话,你会发现线程没有停止过。相当于,隔2秒就执行一次,无限循环下去。
为什么还会执行?嗯,这是个问题。好了,我也不卖关子了。

退出的时候,程序相当于只是 finish 掉了,如果只是简单的finish的话,该程序并没有销毁掉,主线程还继续运行的,只是被前一个activity覆盖而已。

有人说:Android应用本身就是一个进程,当我们退出应用时,这个进程就已经销毁了吧?

可是并没有…

Android的特色: 当应用程序退出的时候进程资源并没有销毁,这样做是为了下次启动这个程序的更快…我想Android的思想是达到资源利用率的最大化,但这也有弊端,如果有应用需要系统资源,而系统资源又不够,那么就得去销毁掉其它资源,腾出地方来…

如果你想知道是不是真的没有销毁,你可以在onCreate判断savedInstanceState是否等于NULL就可以知道是不是reinitialized了,或者在onBackPressed调用System.exit(0)真正退出进程。

android的特色之一:并不由用户来销毁activity,activity 的生命周期完全交给系统来管理 ,等系统在适当的时候来回收资源。当你按下backspace键的时候,只是简单的将位于堆栈里下一个activity弹出,将原来的activity压栈而已,系统并保存原来的activity的一些历史信息,并不销毁,等你下次打开的时候,能够很快的恢复。

android的特色之二:进程资源并没被销毁,Activity的主线程也是没有退出的,因此Activity中的消息队列会一致执行下去,当再此启动Activity的时候,又会实例化一Rrunnable,又会向此消息队列中添加一个这个Runnable。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

(0)

相关推荐

  • android使用AsyncTask实现多线程下载实例

    AsyncTask不仅方便我们在子线程中对UI进行更新操作,还可以借助其本身的线程池来实现多线程任务.下面是一个使用AsyncTask来实现的多线程下载例子. 01 效果图 02 核心类 - DownloadTask.class public class DownloadTask extends AsyncTask<String, Integer, Integer> { public static final int TYPE_SUCCESS = 0; public static final

  • Android 中通过实现线程更新Progressdialog (对话进度条)

    作为开发者我们需要经常站在用户角度考虑问题,比如在应用商城下载软件时,当用户点击下载按钮,则会有下载进度提示页面出现,现在我们通过线程休眠的方式模拟下载进度更新的演示,如图(这里为了截图方便设置对话进度条位于屏幕上方): layout界面代码(仅部署一个按钮): <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.androi

  • Android使用listview实现分页刷新(线程休眠模拟)

    当要显示的数据过多时,为了更好的提升用户感知,在很多APP中都会使用分页刷新显示,比如浏览新闻,向下滑动到当前ListView的最后一条信息(item)时,会提示刷新加载,然后加载更新后的内容.此过程大致分以下几步: 1.当前Activity implements OnScallListenner: 2.实现接口的方法: 3.ListView注册滚动监听: 4. Adapter(自定义或者安卓自带)为每个item填充数据: 5.获得第二页以后的数据后,adater增加数据并刷新notifyDat

  • android主线程和子线程之间消息传递详解

    从主线程发送消息到子线程(准确地说应该是非UI线程) package com.zhuozhuo; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.os.Message; import android.util.Log; import android.view.View; import android.

  • Android 中不用线程如何实现倒计时

    需求: 有多个组件可以开启倒计时,正常情况下默认倒计时时间终了后更新UI,另,用户可以取消指定倒计时. 这里使用CountDownTimer进行倒计时,其中回调函数onFinish是在倒计时终了时回调,onTick是在倒计时开始时回调,用户可以使用CountDownTimer对象的cancel方法取消倒计时. 这样做的好处:不需要使用繁琐的线程去控制倒计时,更方便的进行UI更新. 上代码: MainActivity package test.demo.countdowntest; import

  • Android Socket 线程连接openwrt与arduino单片机串口双向通信的实例解析

    废话不多说了,直接给大家贴代码了,具体代码如下所示: package zcd.netanything; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket; import android.app.Fragment; import android.content.BroadcastReceiver; import and

  • Android线程实现图片轮播

    一.实现效果 本篇文章实现了简单的图片轮播,初始化3张资源图片,初始化3秒更换一次图片背景,轮换播放. 二.知识点 Thread线程start() .sleep();handler机制;Android 控件imageView.setBackgroundResource(id); 还算是较为简单的,涉及的基本都是基础知识. 三.基本思路 1.初始化资源文件 2.创建一个实例化线程对象 new Thread() 3.handler 机制,sendMessage(msg); 来处理线程信息,以改变当前

  • Android实现网络多线程断点续传下载实例

    我们编写的是Andorid的HTTP协议多线程断点下载应用程序.直接使用单线程下载HTTP文件对我们来说是一件非常简单的事.那么,多线程断点需要什么功能? 1.多线程下载, 2.支持断点. 使用多线程的好处:使用多线程下载会提升文件下载的速度.那么多线程下载文件的过程是: (1)首先获得下载文件的长度,然后设置本地文件的长度. HttpURLConnection.getContentLength();//获取下载文件的长度 RandomAccessFile file = new RandomAc

  • Android 开发中线程的分析

    Android 开发中线程的分析 今天早上把公司给的任务做完了之后,突然就有点无聊,于是,把以前学的那些东西翻了翻,博客看了看,就看到一个关于线程的博客,有了很大的争议,我也差点误解了(感觉高大上~~~).整体代码差不多是这样: package sw.angel.thread; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.util.Log; pub

  • Android开发中线程池源码解析

    线程池(英语:thread pool):一种线程使用模式.线程过多会带来调度开销,进而影响缓存局部性和整体性能.而线程池维护着多个线程,等待着监督管理者分配可并发执行的任务.这避免了在处理短时间任务时创建与销毁线程的代价.线程池不仅能够保证内核的充分利用,还能防止过分调度.可用线程数量应该取决于可用的并发处理器.处理器内核.内存.网络sockets等的数量. 例如,线程数一般取cpu数量+2比较合适,线程数过多会导致额外的线程切换开销.----摘自维基百科 我们在Android或者Java开发中

  • Android开发中PopupWindow用法实例分析

    本文实例分析了Android开发中PopupWindow用法.分享给大家供大家参考,具体如下: private TextView tv_appmanager_title; private ListView lv_app_manager; private LinearLayout ll_appmanager_loading; private AppManagerProvider provider; private List<AppManagerInfo> infos ; private AppM

  • Android开发中Widget的生命周期实例分析

    本文实例分析了Android开发中Widget的生命周期.分享给大家供大家参考,具体如下: Widget是android中桌面小控件,创建时必须继承AppWidgetProvider,AppWidgetProvider其实就是继承了BroadcastReceiver的Receiver的一种,widget有以下几个生命周期方法: 1.onEnabled方法:此方法在Widget第一次被创建的时候调用,并且只调用一次,此方法中常放入初始化数据,服务的操作. 2.onReceive方法:通Broadc

  • Android开发中Intent传递对象的方法分析

    本文实例分析了Android开发中Intent传递对象的方法.分享给大家供大家参考,具体如下: 方法一: 利用方法:public Intent putExtra (String name, Parcelable value)传递一个Parceable的参数,此方法的参数被序列化到内存. 利用方法:public Intent putExtra (String name, Serializable value)传递一个实现了序列化接口类的对象,此方法的实参被序列化到磁盘. 方法二: 把数据存放到应用

  • Android开发中播放声音的两种方法分析

    本文实例讲述了Android开发中播放声音的两种方法.分享给大家供大家参考,具体如下: 在Android中,音频.视频等多媒体元素的加入,使得应用程序的用户体验更好.可以说,现在的手机,已经远远不只作为通信工具,更成为娱乐.办公的必备产品. Android提供了简单的音频API.一般大家使用的是MediaPlayer播放音频,这也是最常见的一种播放声音的工具.这种工具在互联网上有大量的实例,因此在此只做简单的介绍. 对播放行为的控制是三个大家非常熟悉的方法:start().stop()和paus

  • Android开发中的数据库事务用法分析

    本文实例讲述了Android开发中的数据库事务用法.分享给大家供大家参考,具体如下: 在android应用程序开发中,在使用到数据库的时候,事务处理是非常重要的. 首先Android数据库操作(特别是写操作)是非常慢的,将所有操作打包成一个事务能大大提高处理速度. 其次是保证数据的一致性,让一个事务中的所有操作都成功执行,或者失败,或者所有操作回滚. 如果您喜欢使用其他平台(如PHP + MySQL),代码通常在一个功能强大的服务器上运行,一般不会被意外中止,但在android平台上,您将会因为

  • Android开发中include控件用法分析

    本文实例讲述了Android开发中include控件用法.分享给大家供大家参考,具体如下: 我们知道,基于Android系统的应用程序的开发,界面设计是非常重要的,它关系着用户体验的好坏.一个好的界面设计,不是用一个xml布局就可以搞定的.当一个activity中的控件非常多的时候,所有的布局文件都放在一个xml文件中,很容易想象那是多么糟糕的事情!笔者通过自身的经历,用include控件来解决这个问题,下面是一个小例子,仅仅实现的是布局,没有响应代码的设计. user.xml文件内容如下: <

  • Android开发中setContentView和inflate的区别分析

    本文实例讲述了Android开发中setContentView和inflate的区别.分享给大家供大家参考,具体如下: 一般用LayoutInflater做一件事:inflate inflate这个方法总共有四种形式(见下面),目的都是把xml表述的layout转化为View对象. 其中有一个比较常用,View inflate(int resource, ViewGroup root),另三个,其实目的和这个差不多. int resource,也就是resource/layout文件在R文件中对

  • Android开发中MotionEvent坐标获取方法分析

    本文实例讲述了Android开发中MotionEvent坐标获取方法.分享给大家供大家参考,具体如下: Android MotionEvent中getX()与getRawX()都是获取屏幕坐标(横),但二者又有区别 getX()           :   是获取相对当前控件(View)的坐标 getRawX()   :   是获取相对显示屏幕左上角的坐标 演示示例代码 Java代码: public class MainActivity extends Activity implements O

随机推荐