有时在更新UI时,会报这个错:Only the original thread that created a view hierarchy can touch its views.
在修改UI时需要自己添加一个新的线程,不然的话会阻塞UI主线程,所以只需要我们把代码放到我们自己添加的线程中就可以了,但这里需要注意的是,需要把代码放到我们所创建的线程Hander中,别且Hander是被抛出的。不然的话有可能还会报同样的错误。但是我不知道在线程中创建的Hander和被发送出的Hander有什么区别?
还有在平时使用时,会忽略一个重要的问题就是。Hander必须在主线程中生成,否侧还是会报同样的错误!
在非本Activity中使用Hander时,一定要注意,我们所引用的Hander对像是否是在Activity中创建生成的,如果不是的话。还会报同样的错误。
Activity之间的参数传递
假设有2个Activity,分别为 ActivityA和 ActivityB, ActivityA负责调用 ActivityB。
(一)ActivityA传递参数给 ActivityB
ActivityA类的代码:
Bundle bundle = new Bundle(); bundle.putInt("id", 120);//要传递的参数,根据实际要求设置 Intent intent = new Intent(this,ActivityB.class); intent.putExtras(bundle); //这里用startActivityForResult,表明还需要从ActivityB接收返回参数 //其中参数 3 :自己设置的参数,表示调用ActivityB行为的编号,在接收返回参数时候需要使用 startActivityForResult(intent, 3);
(二)ActivityB传递参数给 ActivityA
ActivityB的代码:
//定义返回参数 Intent intent = new Intent(); intent.putExtra("result_value", user.getId().intValue()); //设置返回值 //其中参数 100:自己定义的,表示返回编号 //(不同情况可以有不同的返回编号,让调用者可以根据不同的返回编号进行不同的处理) setResult(100, intent); //执行finish后,即关闭当前ActivityB,且将上面设置的参数进行返回 finish();
ActivityA的中用于接收返回参数的代码:
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { int resultValue = 0; //requestCode:对应ActivitA中startActivityForResult(intent, 3);中的3 switch(requestCode){ case 3: //resultCode:对应ActivitB中setResult(100, intent);中的100 switch(resultCode){ case 100: resultValue = data.getIntExtra("result_value", -1); Toast.makeText(this, "返回值["+resultValue+"]", Toast.LENGTH_LONG).show(); break; default: Toast.makeText(this, "错误返回值["+resultCode+"]", Toast.LENGTH_LONG).show(); } break; default: Toast.makeText(this, "错误请求值["+requestCode+"]", Toast.LENGTH_LONG).show(); } }
一 第一种安装方法:
1.从http://code.google.com/p/core-plot/downloads/list下载CorePlotInstaller_xxx.zip, 下载后解压并安装, 会将SDK默认安装在/Library/SDKs/CorePlotSDK/目录下.
2. 安装后, 在/Library/SDKs/CorePlotSDK/下有两个文件夹iphoneos.sdk和iphonesimulator.sdk, 可见一个是用于真机, 另外一个是用于模拟器. 现在我们用lipo命令将两个静态库合并:
打开命令行 Terminal.app 输入:
lipo -create
然后依次把两个.a文件拖到终端窗口, 命令行会变成这样:
lipo -create /Library/SDKs/CorePlotSDK/iphoneos.sdk/usr/lib/libCorePlot.a /Library/SDKs/CorePlotSDK/iphonesimulator.sdk/usr/lib/libCorePlot.a
然后接着输入 -output 目标文件路径,如:
-output /Users/keesuper/Test/Core_Plot_Test/coreplot/lib/libCorePlotAll.a
最后现在这样一条命令:
lipo -create /Library/SDKs/CorePlotSDK/iphoneos.sdk/usr/lib/libCorePlot.a /Library/SDKs/CorePlotSDK/iphonesimulator.sdk/usr/lib/libCorePlot.a -output /Users/keesuper/Test/Core_Plot_Test/coreplot/lib/libCorePlotAll.a
好了,回车,这样就会生成通用的静态库.
3. 将
/Library/SDKs/CorePlotSDK/iphoneos.sdk/usr/下的include目录复制到/Users/keesuper/Test/Core_Plot_Test/coreplot/目录下.
4. Xcode->Project->Edit Project Settings,打开你的工程配置,点击Bulids标签, 将Configuration设置成All Configuration, 在: Header Search Paths里添加"./coreplot/include"; Library Search Paths里添加"./coreplot/lib". 在other link flags里添加"-ObjC -all_load -lCorePlotAll"
二 第二种安装方法:
1. 下载并安装Mercurial(很简单,在http://www.selenic.com/mercurial/wiki/ 有标准Mac安装包下载),再使用命令:
hg clone http://core-plot.googlecode.com/hg/ core-plot
即可把Core Plot项目源代码下载到指定目录core-plot下。
2. 将下载好了的源码复制到工程目录下,
Add->Existing Files…,把CorePlot-CocoaTouch.xcodeproj添加到新项目中
3. 选择Target “get info->General”,添加对项目CorePlot-CocoaTouch的依赖(引用),(点击Linked Library上的"+"号).
4.选择新项目的“get info->Build”,在“User Header Search Paths”中添加Core Plot头文件搜索路径,如:/Users/kmyhy/core-plot/framework。注意要选中“Recursive”小勾.