本文实例分析了Android开发中Intent传递对象的方法。分享给大家供大家参考,具体如下:方法一:利用方法:public Intent putExtra (String name, Parcelable value)传递一个Parceable的参数,此方法的参数被序列化到内存。利用方法:public Intent putExtra (String name, Serializable value)传递一个实现了序列化接口类的对象,此方法的实参被序列化到磁盘。方法二:把数据存放到应用程序的“Context”中,定义MyApplication类,让其继承Application类,在MyApplication中存入相关数据的引用。代码如下:import android.app.Application;import cn.itcast.mobilesafe.domain.TaskInfo;public class MyApplication extends Application { public TaskInfo tastInfo;}在清单文件中配置Application:<application android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:name="MyApplication"> <uses-library android:name="android.test.runner" />将要存放的数据存入Application中:Intent intent = new Intent(TaskManagerActivity.this, AppDetailActivity.class);MyApplication myApp = (MyApplication) getApplication();Object obj = lv_task_manager.getItemAtPosition(position);if(obj instanceof TaskInfo){ TaskInfo info = (TaskInfo) obj; myApp.tastInfo = info; startActivity(intent);}更多关于Android相关内容感兴趣的读者可查看本站专题:《Android开发入门与进阶教程》、《Android通信方式总结》、《Android基本组件用法总结》、《Android视图View技巧总结》、《Android布局layout技巧总结》及《Android控件用法总结》希望本文所述对大家Android程序设计有所帮助。

先上Android仿微博菜单弹出效果图,这个截图不是很流畅,大家可以下载apk试一下。 说一下实现思路: 1、截取当前窗口,对图片做高斯模糊处理,将处理后的图片做popupwindow的背景图片; 2、创建popupwindow,完成布局,这儿要注意:View的移动范围是由parent的大小决定的,就是只能在parent的范围内移动; 3、给买个View添加进入动画,每个比前一个延期50ms播放动画,关闭窗口时相反; 4、为View的动画添加回弹插值器;MoreWindow.java窗口 package com.jerome.weibo; import android.animation.Animator; import android.animation.Animator.AnimatorListener; import android.animation.ObjectAnimator; import android.animation.ValueAnimator; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Rect; import android.graphics.drawable.BitmapDrawable; import android.os.Handler; import android.util.DisplayMetrics; import android.util.Log; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.view.animation.Animation; import android.view.animation.Animation.AnimationListener; import android.view.animation.AnimationSet; import android.view.animation.TranslateAnimation; import android.widget.ImageView; import android.widget.PopupWindow; import android.widget.RelativeLayout; import android.widget.RelativeLayout.LayoutParams; public class MoreWindow extends PopupWindow implements OnClickListener{ private String TAG = MoreWindow.class.getSimpleName(); Activity mContext; private int mWidth; private int mHeight; private int statusBarHeight ; private Bitmap mBitmap= null; private Bitmap overlay = null; private Handler mHandler = new Handler(); public MoreWindow(Activity context) { mContext = context; } public void init() { Rect frame = new Rect(); mContext.getWindow().getDecorView().getWindowVisibleDisplayFrame(frame); statusBarHeight = frame.top; DisplayMetrics metrics = new DisplayMetrics(); mContext.getWindowManager().getDefaultDisplay() .getMetrics(metrics); mWidth = metrics.widthPixels; mHeight = metrics.heightPixels; setWidth(mWidth); setHeight(mHeight); } private Bitmap blur() { if (null != overlay) { return overlay; } long startMs = System.currentTimeMillis(); View view = mContext.getWindow().getDecorView(); view.setDrawingCacheEnabled(true); view.buildDrawingCache(true); mBitmap = view.getDrawingCache(); float scaleFactor = 8;//图片缩放比例; float radius = 10;//模糊程度 int width = mBitmap.getWidth(); int height = mBitmap.getHeight(); overlay = Bitmap.createBitmap((int) (width / scaleFactor),(int) (height / scaleFactor),Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(overlay); canvas.scale(1 / scaleFactor, 1 / scaleFactor); Paint paint = new Paint(); paint.setFlags(Paint.FILTER_BITMAP_FLAG); canvas.drawBitmap(mBitmap, 0, 0, paint); overlay = FastBlur.doBlur(overlay, (int) radius, true); Log.i(TAG, "blur time is:"+(System.currentTimeMillis() - startMs)); return overlay; } private Animation showAnimation1(final View view,int fromY ,int toY) { AnimationSet set = new AnimationSet(true); TranslateAnimation go = new TranslateAnimation(0, 0, fromY, toY); go.setDuration(300); TranslateAnimation go1 = new TranslateAnimation(0, 0, -10, 2); go1.setDuration(100); go1.setStartOffset(250); set.addAnimation(go1); set.addAnimation(go); set.setAnimationListener(new AnimationListener() { @Override public void onAnimationEnd(Animation animation) { } @Override public void onAnimationRepeat(Animation animation) { } @Override public void onAnimationStart(Animation animation) { } }); return set; } public void showMoreWindow(View anchor,int bottomMargin) { final RelativeLayout layout = (RelativeLayout)LayoutInflater.from(mContext).inflate(R.layout.center_music_more_window, null); setContentView(layout); ImageView close= (ImageView)layout.findViewById(R.id.center_music_window_close); android.widget.RelativeLayout.LayoutParams params =new android.widget.RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT); params.bottomMargin = bottomMargin; params.addRule(RelativeLayout.BELOW, R.id.more_window_auto); params.addRule(RelativeLayout.RIGHT_OF, R.id.more_window_collect); params.topMargin = 200; params.leftMargin = 18; close.setLayoutParams(params); close.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (isShowing()) { closeAnimation(layout); } } }); showAnimation(layout); setBackgroundDrawable(new BitmapDrawable(mContext.getResources(), blur())); setOutsideTouchable(true); setFocusable(true); showAtLocation(anchor, Gravity.BOTTOM, 0, statusBarHeight); } private void showAnimation(ViewGroup layout){ for(int i=0;i<layout.getChildCount();i++){ final View child = layout.getChildAt(i); if(child.getId() == R.id.center_music_window_close){ continue; } child.setOnClickListener(this); child.setVisibility(View.INVISIBLE); mHandler.postDelayed(new Runnable() { @Override public void run() { child.setVisibility(View.VISIBLE); ValueAnimator fadeAnim = ObjectAnimator.ofFloat(child, "translationY", 600, 0); fadeAnim.setDuration(300); KickBackAnimator kickAnimator = new KickBackAnimator(); kickAnimator.setDuration(150); fadeAnim.setEvaluator(kickAnimator); fadeAnim.start(); } }, i * 50); } } private void closeAnimation(ViewGroup layout){ for(int i=0;i<layout.getChildCount();i++){ final View child = layout.getChildAt(i); if(child.getId() == R.id.center_music_window_close){ continue; } child.setOnClickListener(this); mHandler.postDelayed(new Runnable() { @Override public void run() { child.setVisibility(View.VISIBLE); ValueAnimator fadeAnim = ObjectAnimator.ofFloat(child, "translationY", 0, 600); fadeAnim.setDuration(200); KickBackAnimator kickAnimator = new KickBackAnimator(); kickAnimator.setDuration(100); fadeAnim.setEvaluator(kickAnimator); fadeAnim.start(); fadeAnim.addListener(new AnimatorListener() { @Override public void onAnimationStart(Animator animation) { // TODO Auto-generated method stub } @Override public void onAnimationRepeat(Animator animation) { // TODO Auto-generated method stub } @Override public void onAnimationEnd(Animator animation) { child.setVisibility(View.INVISIBLE); } @Override public void onAnimationCancel(Animator animation) { // TODO Auto-generated method stub } }); } }, (layout.getChildCount()-i-1) * 30); if(child.getId() == R.id.more_window_local){ mHandler.postDelayed(new Runnable() { @Override public void run() { dismiss(); } }, (layout.getChildCount()-i) * 30 + 80); } } } @Override public void onClick(View v) { switch (v.getId()) { case R.id.more_window_local: break; case R.id.more_window_online: break; case R.id.more_window_delete: break; case R.id.more_window_collect: break; case R.id.more_window_auto: break; case R.id.more_window_external: break; default: break; } } public void destroy() { if (null != overlay) { overlay.recycle(); overlay = null; System.gc(); } if (null != mBitmap) { mBitmap.recycle(); mBitmap = null; System.gc(); } } }  KickBackAnimator.Java回弹效果: package com.jerome.weibo; import android.animation.TypeEvaluator; public class KickBackAnimator implements TypeEvaluator<Float> { private final float s = 1.70158f; float mDuration = 0f; public void setDuration(float duration) { mDuration = duration; } public Float evaluate(float fraction, Float startValue, Float endValue) { float t = mDuration * fraction; float b = startValue.floatValue(); float c = endValue.floatValue() - startValue.floatValue(); float d = mDuration; float result = calculate(t, b, c, d); return result; } public Float calculate(float t, float b, float c, float d) { return c * ((t = t / d - 1) * t * ((s + 1) * t + s) + 1) + b; } } 代码见github: https://github.com/gqdy365/WeiboPopupWindow 请大家star一下,我后面会持续更新;下面是apk下载地址:WeiboPopupWindow以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

详解Android 中AsyncTask 的使用 1、首先我们来看看AsyncTask 的介绍:     Handler 和 AsyncTask 都是android 中用来实现异步任务处理的方式;其中:    Handler 实例向 UI 线程发送消息,完成界面更新,         优点:对整个过程控制的比较精细;         缺点:代码相对臃肿,多个任务同时执行时,不易对线程进行精确的控制;    AsyncTask :比Handler 更轻量级一些,适用于简单的异步处理;         优点:简单 | 快捷 | 过程可控;         缺点:使用多个异步操作时就变得复杂起来;2、AsyncTask 的定义:(AsyncTask 定义了三种泛型类型)  public abstract class AsyncTask<Params,Progress,Result>{...}     说明:         Params :启动任务执行的输入参数,例如:HTTP 请求的URL;         Progress: 后台任务执行的百分比;         Result:后台执行任务最终返回的结果,比如String;3、AsyncTask 异步任务的执行步骤:(以下方法除execute(Params... params),在AsyncTask中重写),下列是相关方法的介绍:     A、execute(Params... params) :         执行一个异步任务,需要我们在UI线程中调用,触发任务    B、OnPreExecute():         execute(Params... params)调用后立即执行,一般用于在执行后台任务前对UI做一些标记; 例如,可以在此处显示进度对话框;    C、doInBackground(Params.. params):         onPreExecute() 完成后执行,后台执行,处理比较耗时的操作;此处不能操作UI,执行的过程中调用publishProgress(Progress... values)来更新进度信息;    D、onProgressUpdate(Progress... values):         在调用publicshProgress(Progress... values)方法执行,直接将进度信息更新到UI组建上;此方法在主线程上执行,用于显示任务执行的进度;    E、onPostExecute(Result result):         此方法在主线程中执行,当后台的操作结束时,此方法会被调用,计算结果作为参数传递到此方法中,直接将结果显示到UI组建上。    F、cancel(); :         取消一个正在执行的任务,在UI线程中完成,用AsyncTask的对象进行调用,参数为true/false;4、使用AsyncTask 时注意事项:     A、异步任务实例必须在UI线程中创建;     B、execute(Params... params) 方法必须在UI线程中调用;     C、不要手动的调onPreExecute().doInBackground().onProgressUpdate().onPostExecute()这几个方法;     D、不能在doInBackground(Params... params) 中更改组件信息;     E、一个任务实例只能执行一次,如果执行第二次会抛出异常;5、案例:使用AsyncTask 实现图片的下载:     Activity类,主程序的入口: public class MainActivity extends Activity { // 程序入口 protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); MyAsyncTask my = new MyAsyncTask(); my.execute("http://photocdn.sohu.com/20110927/Img320705637.jpg"); } }    AsyncTask 派生类,实现异步任务: package com.sun.asynctask; import java.io.ByteArrayOutputStream; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; import org.apache.http.HttpConnection; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.HttpStatus; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.DefaultHttpClient; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.AsyncTask; import android.util.Log; /** * 异步任务,实现网页内容的获取 * * * 生成该类的对象,并调用execute方法之后 * * 首先执行的是onProExecute() 方法, * * 其次执行的doInBackground()方法 */ public class MyAsyncTask extends AsyncTask<String, Integer, Bitmap> { /** * 在execute() 方法执行后立即执行,运行在UI线程中, * 在后台任务开始前执行,用于标识UI界面 */ protected void onPreExecute() { super.onPreExecute(); Log.i("msg","onPreExecute()..."); } /** * 后台执行耗时的任务; * * 方法中的 String 参数对应 AsyncTask的第一个参数; * 返回的 Bitmap 对应的是AsyncTask 的第三个参数; * * 该方法并不运行在UI线程中,主要用于异步操作,可以调用publishProgress()方法触发 * onProgressUpdate对UI进行操作; * */ protected Bitmap doInBackground(String... params) { Log.i("msg","doInBackground(String... params)..."); try { /* 网络访问方式 二 */ /* URL url = new URL(params[0]); HttpsURLConnection connection = (HttpsURLConnection) url.openConnection(); connection.connect(); // 开始连接 int zong = connection.getContentLength(); InputStream is2 = connection.getInputStream(); */ /* 开始网络访问数据 */ HttpGet hg = new HttpGet(params[0]); // 此处注意参数的用法 HttpClient hc = new DefaultHttpClient(); HttpResponse hr = hc.execute(hg); // 发送请求,得到响应 // 判断请求是否成功 if(hr.getStatusLine().getStatusCode() == HttpStatus.SC_OK){ Log.i("msg", "access success..."); HttpEntity he = hr.getEntity(); InputStream is = he.getContent(); // 获取输入流对象,好比搭桥 long total = he.getContentLength(); // 文件的总字节数 ByteArrayOutputStream baos = new ByteArrayOutputStream(); // 输出流,临时容器,用于装从is中流出的数据 byte[] buffer = new byte[1024]; // 缓存容器,每次装载1024 个字节数据 int len = 0; // 每次读的字节数 int curLen = 0 ; // 已读多少数据 while((len=is.read(buffer))!=-1){ // 当len !=-1 时,也就是还有数据可读 Log.i("msg","begin read data..."+len+",total:"+total); baos.write(buffer, 0, len); // 向临时容器中装数据 curLen=curLen+len; // 更新已读的数据 /* 在UI显示当前读取的进度 , 调用次方法触发onProgressUpdate() 方法执行 */ publishProgress((int)(((float)curLen/total)*100)); } Bitmap bitmap = BitmapFactory.decodeByteArray(baos.toByteArray(), 0, (int)total); is.close(); return bitmap; } } catch (Exception e) { e.printStackTrace(); } return null; } /** * 括号中的参数:String 对应的是AsyncTask 的第三个参数,也就是 * 接收了 从doInBackground() 返回的结果; * 此方法在 doInBackground() 方法执行结束后执行,运行在UI线程中, * 可以对UI进行更新 */ protected void onPostExecute(Bitmap result) { super.onPostExecute(result); Log.i("msg","onPostExecute(String result)..."+result.getHeight()); } /** * 方法括号中的Integer 对应AsyncTask 中的第二个参数; * 在doInBackground() 中每次调用publishProgress() 时被执行; * 该方法是在UI线程中的,所以可以用于对UI进行更新 */ protected void onProgressUpdate(Integer... values) { super.onProgressUpdate(values); Log.i("msg","onProgressUpdate(Integer... values)..."+values[0]); } /** * 图片的下载 */ public HttpURLConnection downPic(String urltemp){ try { URL url = new URL(urltemp); // 确定连接地址 // 打开一个连接 HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.connect(); // 开始连接 return connection; } catch (Exception e) { e.printStackTrace(); } return null; } } 以上就是Android AsyncTask的应用实例,如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

学过c/c++的朋友都知道,我们定义struct/class的时候,如果把访问限定符(public,protected,private)设置为public的话,那么我们是可以直接用.号来访问它内部的数据成员的。比如//in Test.hclass Test{public: int i; float f;};  我在main函数里面是可以通过下面的方式来使用这个类的:(注意,如果在main函数里面使用此类,除了要包含头文件以外,最重要的是记得把main.m改成main.mm,否则会报一些奇怪的错误。所以,任何时候我们使用c++,如果报奇怪的错误,那就要提醒自己是不是把相应的源文件改成.mm后缀了。其它引用此类的文件有时候也要改成.mm文件)  //in main.mm Test test; test.i =1; test.f =2.4f; NSLog(@"Test.i = %d, Test.f = %f",test.i, test.f);  但是,在objc里面,我们能不能这样做呢?请看下面的代码:(新建一个objc类,命名为BaseClass)复制代码 代码如下://in [email protected] BaseClass : NSObject{@public    NSString *_name;} 接下来,我们在main.mm里面:复制代码 代码如下:    BaseClass *base= [[BaseClass alloc] init];    base.name [email protected]"set base name";    NSLog(@"base class's name = %@", base.name);      不用等你编译,xcode马上提示错误,请看截图:请大家注意看出错提示“Property 'nam' not found on object of type BaseClass*",意思是,BaseClass这类没有一个名为name的属性。即使我们在头文件中声明了@public,我们仍然无法在使用BaseClass的时候用.号来直接访问其数据成员。而@public,@protected和@private只会影响继承它的类的访问权限,如果你使用@private声明数据成员,那么在子类中是无法直接使用父类的私有成员的,这和c++,java是一样的。  既然有错误,那么我们就来想法解决啦,编译器说没有@property,那好,我们就定义property,请看代码:复制代码 代码如下://in [email protected] BaseClass : NSObject{@public    NSString *_name;}@property(nonatomic,copy) NSString *name;//in [email protected] name = _name;  现在,编译并运行,ok,很好。那你可能会问了@prperty是不是就是让”."号合法了呀?只要定义了@property就可以使用.号来访问类的数据成员了?先让我们来看下面的例子:复制代码 代码如下:@interface BaseClass : NSObject{@public    NSString *_name;}//@property(nonatomic,copy) NSString *name;-(NSString*) name;-(void) setName:(NSString*)newName;  我把@property的定义注释掉了,另外定义了两个函数,name和setName,下面请看实现文件:复制代码 代码如下://@synthesize name = _name;-(NSString*) name{    return _name;}-(void) setName:(NSString *)name{    if (_name != name) {        [_name release];        _name = [name copy];    }}  现在,你再编译运行,一样工作的很好。why?因为我刚刚做的工作和先前声明@property所做的工作完全一样。@prperty只不过是给编译器看的一种指令,它可以编译之后为你生成相应的getter和setter方法。而且,注意看到面property(nonatomic,copy)括号里面这copy参数了吗?它所做的事就是复制代码 代码如下:_name = [name copy];  如果你指定retain,或者assign,那么相应的代码分别是://property(retain)NSString* name;_name = [name retain];//property(assign)NSString* name;_name = name;  其它讲到这里,大家也可以看出来,@property并不只是可以生成getter和setter方法,它还可以做内存管理。不过这里我暂不讨论。现在,@property大概做了件什么事,想必大家已经知道了。但是,我们程序员都有一个坎,就是自己没有完全吃透的东西,心里用起来不踏实,特别是我自己。所以,接下来,我们要详细深挖@property的每一个细节。  首先,我们看atomic 与nonatomic的区别与用法,讲之前,我们先看下面这段代码:复制代码 代码如下:@property(nonatomic, retain) UITextField *userName;    //[email protected](nonatomic, retain,readwrite) UITextField *userName;  //[email protected](atomic, retain) UITextField *userName;  //[email protected](retain) UITextField *userName;  //[email protected](atomic,assign) int i;         // [email protected](atomic) int i;         //[email protected] int i;               //7  请读者先停下来想一想,它们有什么区别呢?  上面的代码1和2是等价的,3和4是等价的,5,6,7是等价的。也就是说atomic是默认行为,assign是默认行为,readwrite是默认行为。但是,如果你写上@property(nontomic)NSString *name;那么将会报一个警告,如下图: 因为是非gc的对象,所以默认的assign修饰符是不行的。那么什么时候用assign、什么时候用retain和copy呢?推荐做法是NSString用copy,delegate用assign(且一定要用assign,不要问为什么,只管去用就是了,以后你会明白的),非objc数据类型,比如int,float等基本数据类型用assign(默认就是assign),而其它objc类型,比如NSArray,NSDate用retain。  在继续之前,我还想补充几个问题,就是如果我们自己定义某些变量的setter方法,但是想让编译器为我们生成getter方法,这样子可以吗?答案是当然可以。如果你自己在.m文件里面实现了setter/getter方法的话,那以翻译器就不会为你再生成相应的getter/setter了。请看下面代码:复制代码 代码如下://代码一:@interface BaseClass : NSObject{@public    NSString *_name;}@property(nonatomic,copy,readonly) NSString *name;  //这里使用的是readonly,所有会声明geter方法-(void) setName:(NSString*)newName;//代码二:@interface BaseClass : NSObject{@public    NSString *_name;}@property(nonatomic,copy,readonly) NSString *name;   //这里虽然声明了readonly,但是不会生成getter方法,因为你下面自己定义了getter方法。-(NSString*) name;   //getter方法是不是只能是name呢?不一定,你打开Foundation.framework,找到UIView.h,看看里面的property就明白了)-(void) setName:(NSString*)newName;//代码三:@interface BaseClass : NSObject{@public    NSString *_name;}@property(nonatomic,copy,readwrite) NSString *name;  //这里编译器会我们生成了getter和setter//代码四:@interface BaseClass : NSObject{@public    NSString *_name;}@property(nonatomic,copy) NSString *name;  //因为readwrite是默认行为,所以同代码三  上面四段代码是等价的,接下来,请看下面四段代码:  复制代码 代码如下://代码一:@synthesize name = _name;  //这句话,编译器发现你没有定义任何getter和setter,所以会同时会你生成getter和setter//代码二:@synthesize name = _name;  //因为你定义了name,也就是getter方法,所以编译器只会为生成setter方法,也就是setName方法。-(NSString*) name{    NSLog(@"name");    return _name;}//代码三:@synthesize name = _name;   //这里因为你定义了setter方法,所以编译器只会为你生成getter方法-(void) setName:(NSString *)name{    NSLog(@"setName");    if (_name != name) {        [_name release];        _name = [name copy];    }}//代码四:@synthesize name = _name;  //这里你自己定义了getter和setter,这句话没用了,你可以注释掉。-(NSString*) name{    NSLog(@"name");    return _name;}-(void) setName:(NSString *)name{    NSLog(@"setName");    if (_name != name) {        [_name release];        _name = [name copy];    }}  上面这四段代码也是等价的。看到这里,大家对Property的作用相信会有更加进一步的理解了吧。但是,你必须小心,你如果使用了Property,而且你自己又重写了setter/getter的话,你需要清楚的明白,你究竟干了些什么事。别写出下面的代码,虽然是合法的,但是会误导别人:复制代码 代码如下://[email protected] BaseClass : NSObject{@public    NSArray *_names;}@property(nonatomic,assgin,readonly) NSArray *names;  //注意这里是assign-(void) setNames:(NSArray*)names;//[email protected] [email protected] names = _names;-(NSArray*) names{    NSLog(@"names");    return _names;}-(void) setNames:(NSArray*)names{    NSLog(@"setNames");    if (_name != name) {        [_name release];        _name = [name retain];  //你retain,但是你不覆盖这个方法,那么编译器会生成setNames方法,里面肯定是用的assign    }}  当别人使用@property来做内存管理的时候就会有问题了。总结一下,如果你自己实现了getter和setter的话,atomic/nonatomic/retain/assign/copy这些只是给编译的建议,编译会首先会到你的代码里面去找,如果你定义了相应的getter和setter的话,那么好,用你的。如果没有,编译器就会根据atomic/nonatomic/retain/assign/copy这其中你指定的某几个规则去生成相应的getter和setter。我们来整理一下@property中的属性关键字:1.原子性 nonatomic/atomic在默认的情况下,由编译器合成的方法会通过锁定机制确保其原子性(atomicity)。如果具备nonatomic特质,则不使用同步锁。2.读/写权限  readwrite/readonly3.内存管理语义assign “设置方法” 只会针对“纯量类型”(scalar type, CGFloat或NSInteger等)的简单赋值操作strong “拥有关系” 为这种属性设置新值时,设置方法先保留新值,并释放旧值,然后再将新值设置上去weak “非拥有关系” 为这种属性设置新值时,设置方法既不保留新值,也不释放旧值。此特质同assign类似,然而属性所指的对象遭到摧毁时,属性也会被清空(nil out)unsafe_unretained 此特质的语义和assign相同,但是它适用于“对象类型”(object type),该特质表达一种“非拥有关系”(“不保留”,unretained),当目标对象遭到摧毁时,属性值不会自动清空(“不安全”,unsafe),这一点与weak有区别copy 此特质所表达的所属关系与strong类似。然而设置方法并不保留新值,而是将其“拷贝”(copy)4.方法名getter=<name>@property (nonatomic, getter=isOn) BOOL on;setter=<name> 不太常用总结  好了,说了这么多,回到我们的正题吧。atomic和nonatomic的作用与区别:  如果你用@synthesize去让编译器生成代码,那么atomic和nonatomic生成的代码是不一样的。如果使用atomic,如其名,它会保证每次getter和setter的操作都会正确的执行完毕,而不用担心其它线程在你get的时候set,可以说保证了某种程度上的线程安全。但是,我上网查了资料,仅仅靠atomic来保证线程安全是很天真的。要写出线程安全的代码,还需要有同步和互斥机制。  而nonatomic就没有类似的“线程安全”(我这里加引号是指某种程度的线程安全)保证了。因此,很明显,nonatomic比atomic速度要快。这也是为什么,我们基本上所有用property的地方,都用的是nonatomic了。  还有一点,可能有读者经常看到,在我的教程的dealloc函数里面有这样的代码:self.xxx = nil;看到这里,现在你们明白这样写有什么用了吧?它等价于[xxx release];  xxx = [nil retain];(---如果你的property(nonatomic,retian)xxx,那么就会这样,如果不是,就对号入座吧)。  因为nil可以给它发送任何消息,而不会出错。为什么release掉了还要赋值为nil呢?大家用c的时候,都有这样的编码习惯吧。  int* arr = new int[10];    然后不用的时候,delete arr; arr = NULL;  在objc里面可以用一句话self.arr = nil;搞定。

我要在程序中用到5秒请求一下数据(不建议大家这样做,我的需求是这样)代码展示:1.在OnCreate中创建定时针Timer//每5秒请求一次服务器timer=new Timer();timer.scheduleAtFixedRate(new TimerTask() { @Override public void run() { Message message=new Message(); message.what=1; handler.sendMessage(message); }}, 1000,5000);2.在线程中创建Handlerprivate Handler handler=new Handler(){ public void handleMessage(Message msg) { switch (msg.what) { case 1: updateTitle(); break; default: break; } };};3.创建一个标识为了做循环用private int count=1;4.在case 1中做需要循环的需求(我的是5秒请求) private void updateTitle() { loadHosity(); count++; }5.完成!感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

分类:365bet娱乐城官网

时间:2016-07-26 10:25:29