Activity,Service属于主线程,在主线程中才能更新UI,如toast等。其他线程中不能直接使用,这时可以使用Handler来处理,Handler可以在Activity和Service中。
其实平常一般都是使用AsyncTask的,而并非Thread和Handler去更新UI,这里说下它们到底有什么区别,我们平时应该使用哪种解决方案。从Android 1.5开始系统将AsyncTask引入到android.os包中,过去在很早1.1和1.0 SDK时其实官方将其命名为UserTask,其内部是JDK 1.5开始新增的concurrent库,做过J2EE的网友可能明白并发库效率和强大性,比Java原始的Thread更灵活和强大,但对于轻量级的使用更为占用系统资源。Thread是Java早期为实现多线程而设计的,比较简单不支持concurrent中很多特性在同步和线程池类中需要自己去实现很多的东西,对于分布式应用来说更需要自己写调度代码,而为了Android UI的刷新Google引入了Handler和Looper机制,它们均基于消息实现,有时可能消息队列阻塞或其他原因无法准确的使用。
推荐大家使用AsyncTask代替Thread+Handler的方式,不仅调用上更为简单,经过实测更可靠一些,Google在Browser中大量使用了异步任务作为处理耗时的I/O操作,比如下载文件、读写数据库等等,它们在本质上都离不开消息,但是AsyncTask相比Thread加Handler更为可靠,更易于维护,但AsyncTask缺点也是有的比如一旦线程开启即dobackground方法执行后无法给线程发送消息,仅能通过预先设置好的标记来控制逻辑,当然可以通过线程的挂起等待标志位的改变来通讯,对于某些应用Thread和Handler以及Looper可能更灵活。
那么先让我们看看要使用AsyncTask 类首先要做哪些工作?
1) 子类化AsyncTask
2) 实现AsyncTask中定义的下面一个或几个方法
onPreExecute() 开始执行前的准备工作;
doInBackground(Params...) 开始执行后台处理,可以调用publishProgress方法来更新实时的任务进度;
onProgressUpdate(Progress...) 在publishProgress方法被调用后,UI thread将调用这个方法从而在界面上展示任务的进展情况,例如通过一个进度条进行展示。
onPostExecute(Result) 执行完成后的操作,传送结果给UI 线程。
这4个方法都不能手动调用。而且除了doInBackground(Params...)方法,其余3个方法都是被UI线程所调用的,所以要求:
1) AsyncTask的实例必须在UI thread中创建;
2) AsyncTask.execute方法必须在UI thread中调用;
同时要注意:该task只能被执行一次,否则多次调用时将会出现异常。而且是不能手动停止的,这一点要注意,看是否符合你的需求!
在使用过程中,发现AsyncTask的构造函数的参数设置需要看明白:AsyncTask<Params, Progress, Result>
Params对应doInBackground(Params...)的参数类型。而new AsyncTask().execute(Params... params),就是传进来的Params数据,你可以execute(data)来传送一个数据,或者execute(data1, data2, data3)这样多个数据。
Progress对应onProgressUpdate(Progress...)的参数类型;
Result对应onPostExecute(Result)的参数类型。
当以上的参数类型都不需要指明某个时,则使用Void,注意不是void。
说到这里就得多说几句 你看AsyncTask 你就会发现这个类是个泛型类 这个类是这样定义的。
摘自:
http://mypyg.iteye.com/blog/722449
WindowManager m = getWindowManager();
Display d = m.getDefaultDisplay(); //为获取屏幕宽、高
LayoutParams p = getWindow().getAttributes(); //获取对话框当前的参数值
p.height = (int) (d.getHeight() * 0.6); //高度设置为屏幕的0.6
p.width = (int) (d.getWidth() * 0.95); //宽度设置为屏幕的0.95
getWindow().setAttributes(p); //设置生效
//
System.exit(0);//service will be killed
//
android.os.Process.killProcess(android.os.Process.myPid());//>>
//
finish();
android launchmode小结
br /launchmode4种模式:br /
1,standard:br /
如果从A跳到A,intent5次,task里5个activity;br /
2,single Top:br /
如果从A 跳B,再从B跳A,如果此时栈顶为A,则不创建新实例,直接把Intent给A,但如果栈顶不是A,则还要创建A的实例br /
3,singleTaskbr /
如果从A跳B,再从B跳A,无论是否栈顶栈底,只要A在,则将Intent给A,不会创建A的新实例;br /
4,singleInstancebr /
不同于前3种模式,前3种只是在同一个task的,而实例化的策略不同。这种模式下的activity会单独存在一个task下。br /
现成的例子是google地图。比如我有一个应用是导游方面的,其中调用的google地图Activity。那么现在我比如按home(后台
activity
onstop,back是finish)键,然后到应用列表中打开google地图,你会发现显示的就是刚才的地图,实际上是同一个Activity。
摘自:
http://www.cnblogs.com/wfh1988/archive/2011/01/28/1947045.html
一个APK启动别一个APK的Activity
1、要被启动的那个Apk的manifest.xml的Activity中:
<activity android:name="MyActivity">
<intent-filter>
<action android:name="devdiv.intent.action.MyActivity"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
<activity>
2、另一个要主动启动的Activity:
Intent intent = new Intent("devdiv.intent.action.MyActivity") ;
startActivity(intent);
最近在研究两个界面间的动画,用ViewFlipper倒是可以实现view间手指滑动的切换效果,但是不能实现拖动的效果,貌似重写ViewFlipper也不行,继续研究吧,Express News实现的非常好.到底是用什么方式实现的呢?
google过程中发现这样一个方法,可以非常方便的实现两个activity间的动画,不过遗憾的是只有android2.0版本以上才支持这个方法.记录如下:
Intent intentimage = new Intent();
intentimage.setClass(Now.this, NewsImage.class);
startActivityForResult(intentimage, 250);
overridePendingTransition(R.anim.push_up_in, R.anim.push_up_out);
分享到:
相关推荐
"LabVIEW小功能-前面板调整为修饰框大小尺寸"这个程序提供了一个实用的解决方案,帮助开发者快速调整前面板的布局,使其适应不同需求。LabVIEW的前面板是应用程序的用户界面,它展示给用户所有交互元素,如按钮、...
将mysql数据库的两个表的数据分别写入Excle的两个sheet里面,并设置边框,字体样式,字体大小,颜色等
QRCodeEncoder生成二维码,可设置大小,白边大小,QRCodeEncoder相关dll自行下载。
在编程领域,特别是涉及到用户界面...在实际应用中,我们还需要考虑布局、字体大小、用户自定义设置等因素可能对编辑框大小的影响。因此,理解和掌握这些获取尺寸的方法对于创建响应式和适应性强的用户界面至关重要。
### 设置列表框的背景色 1. **使用SetBkColor函数**:MFC的`CListCtrl`类提供了一个成员函数`SetBkColor`,用于设置列表控件的背景颜色。例如,你可以这样使用: ```cpp CListCtrl myListCtrl; myListCtrl....
本篇文章将详细探讨如何在Visual Studio 2010环境下,利用MFC对文本框中的字体大小和颜色进行设置。 首先,我们需要了解MFC中对话框和编辑框的基本操作。对话框通常由CDialog类表示,而编辑框则对应CEdit类。在VS...
可拖动div边框改变大小的方法,jquery拖拽改变div大小效果,。。。。。。。。。。。。。。。。。。。。。。。。。
本资源提供的是一个易语言调整图片框大小的模块源码,这对于那些需要在易语言环境下处理图像显示的开发者来说是一个非常实用的功能。 易语言的设计理念在于简化编程语法,让编程更加直观,易于理解。在这个特定的...
1. 设置编辑框字体大小: 在CDialog派生类的 OnInitDialog() 函数中,我们可以初始化编辑框的字体。首先创建一个CFont对象,然后通过CFONT::CreatePointFont()或CreateFontIndirect()函数设置字体大小、类型等属性...
《战图全自动识别图框大小批量打印PDFV2.2》是一款专为工程绘图人员设计的高效工具,旨在简化图纸管理和打印流程。这款软件的核心功能在于其强大的自动化能力,能够精准地识别图纸中的图框大小,包括加长图框,从而...
`Cedit`类是MFC(Microsoft Foundation Classes)库中的一个成员,它基于Windows API中的`EDIT`控件,为开发者提供了丰富的功能,包括但不限于修改编辑框的字体大小。 `Cedit`类提供了一系列的成员函数,允许我们...
在Delphi编程环境中, Memo 控件是一个常用的组件,用于显示和...这个例子中的“动态设置 Memo 控件边框的大小”只是 Delphi UI 设计的一个小技巧,但背后体现的是 Delphi 强大的面向对象编程能力和丰富的组件库支持。
对话框的大小是影响用户体验的重要因素,合理的大小设置能够确保内容清晰可见,同时保持界面的整洁和易用性。本篇文章将详细探讨如何在不同编程语言和框架中设置对话框的大小,以及调整大小的最佳实践。 首先,让...
标题所提到的“VS2010 查找和替换框大小不固定解决补丁”正是为了解决这一问题而设计的。 “查找和替换框”的大小不固定可能是由于软件内部的一个bug或者设置问题导致的。这个补丁,即"VS10-KB2268081-x86(查找和...
通过属性设置,我们可以调整编辑框的大小、颜色、字体、是否可编辑等特性。 设置编辑框左右布局的关键在于布局管理,易语言提供了多种布局方式,如网格布局、绝对布局、相对布局等。在本例中,我们可能会使用绝对...
点击【框选范围】按钮, 会出现一个橙色方框 ,鼠标放到方框中间可以手动拖动它移动位置,鼠标放到方框边线可以设置方框大小。 点击左边导航栏 ,选择北京,双击定位到北京市范围。 拖动范围框到需要的位置。 【很多...
这个算法可能基于文字的长度、窗口的大小、字体的设置等因素。例如,可以遍历所有行,找到最长的文字,然后根据文字长度和窗口宽度设定列宽。 4. **动态更新**:当数据或窗口大小发生变化时,需要重新计算并设置...
然后,在`mainwindow.cpp`的构造函数中,初始化这个固定大小,并设置窗口的最小和最大尺寸为相同值,这样窗口就不能被最大化或缩放了: ```cpp MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { ...
在IT行业中,尤其是在图形用户界面(GUI)设计和开发中,"根据图片大小框入画框"是一个常见的需求。这通常涉及到图像显示的适应性,确保图片能够在不同的尺寸下正常显示,同时保持视觉上的和谐。以下是一些相关的...