有时在更新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”小勾.