设置“框”的大小


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 你就会发现这个类是个泛型类 这个类是这样定义的。



摘自:[url]http://mypyg.iteye.com/blog/722449[/url]

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。


摘自:[url]http://www.cnblogs.com/wfh1988/archive/2011/01/28/1947045.html[/url]

一个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);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值