java.lang.NullPointerException
11-26 10:05:25.363: E/AndroidRuntime(28212): at android.widget.AbsListView.obtainView(AbsListView.java:2298)
11-26 10:05:25.363: E/AndroidRuntime(28212): at android.widget.ListView.measureHeightOfChildren(ListView.java:1263)
11-26 10:05:25.363: E/AndroidRuntime(28212): at android.widget.ListView.onMeasure(ListView.java:1175)
11-26 10:05:25.363: E/AndroidRuntime(28212): at android.view.View.measure(View.java:16515)
11-26 10:05:25.363: E/AndroidRuntime(28212): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5169)
11-26 10:05:25.363: E/AndroidRuntime(28212): at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1404)
11-26 10:05:25.363: E/AndroidRuntime(28212): at android.widget.LinearLayout.measureVertical(LinearLayout.java:695)
11-26 10:05:25.363: E/AndroidRuntime(28212): at android.widget.LinearLayout.onMeasure(LinearLayout.java:588)
11-26 10:05:25.363: E/AndroidRuntime(28212): at android.view.View.measure(View.java:16515)
11-26 10:05:25.363: E/AndroidRuntime(28212): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5169)
11-26 10:05:25.363: E/AndroidRuntime(28212): at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
11-26 10:05:25.363: E/AndroidRuntime(28212): at android.view.View.measure(View.java:16515)
11-26 10:05:25.363: E/AndroidRuntime(28212): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5169)
11-26 10:05:25.363: E/AndroidRuntime(28212): at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1404)
11-26 10:05:25.363: E/AndroidRuntime(28212): at android.widget.LinearLayout.measureVertical(LinearLayout.java:695)
11-26 10:05:25.363: E/AndroidRuntime(28212): at android.widget.LinearLayout.onMeasure(LinearLayout.java:588)
11-26 10:05:25.363: E/AndroidRuntime(28212): at android.view.View.measure(View.java:16515)
11-26 10:05:25.363: E/AndroidRuntime(28212): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5169)
11-26 10:05:25.363: E/AndroidRuntime(28212): at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1404)
11-26 10:05:25.363: E/AndroidRuntime(28212): at android.widget.LinearLayout.measureVertical(LinearLayout.java:695)
11-26 10:05:25.363: E/AndroidRuntime(28212): at android.widget.LinearLayout.onMeasure(LinearLayout.java:588)
11-26 10:05:25.363: E/AndroidRuntime(28212): at android.view.View.measure(View.java:16515)
11-26 10:05:25.363: E/AndroidRuntime(28212): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5169)
11-26 10:05:25.363: E/AndroidRuntime(28212): at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
11-26 10:05:25.363: E/AndroidRuntime(28212): at android.view.View.measure(View.java:16515)
11-26 10:05:25.363: E/AndroidRuntime(28212): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5169)
11-26 10:05:25.363: E/AndroidRuntime(28212): at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1404)
11-26 10:05:25.363: E/AndroidRuntime(28212): at android.widget.LinearLayout.measureVertical(LinearLayout.java:695)
11-26 10:05:25.363: E/AndroidRuntime(28212): at android.widget.LinearLayout.onMeasure(LinearLayout.java:588)
11-26 10:05:25.363: E/AndroidRuntime(28212): at android.view.View.measure(View.java:16515)
11-26 10:05:25.363: E/AndroidRuntime(28212): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5169)
11-26 10:05:25.363: E/AndroidRuntime(28212): at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
11-26 10:05:25.363: E/AndroidRuntime(28212): at android.view.View.measure(View.java:16515)
11-26 10:05:25.363: E/AndroidRuntime(28212): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5169)
11-26 10:05:25.363: E/AndroidRuntime(28212): at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
11-26 10:05:25.363: E/AndroidRuntime(28212): at android.view.View.measure(View.java:16515)
11-26 10:05:25.363: E/AndroidRuntime(28212): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5169)
11-26 10:05:25.363: E/AndroidRuntime(28212): at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1404)
11-26 10:05:25.363: E/AndroidRuntime(28212): at android.widget.LinearLayout.measureVertical(LinearLayout.java:695)
11-26 10:05:25.363: E/AndroidRuntime(28212): at android.widget.LinearLayout.onMeasure(LinearLayout.java:588)
11-26 10:05:25.363: E/AndroidRuntime(28212): at android.view.View.measure(View.java:16515)
11-26 10:05:25.363: E/AndroidRuntime(28212): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5169)
11-26 10:05:25.363: E/AndroidRuntime(28212): at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
11-26 10:05:25.363: E/AndroidRuntime(28212): at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2310)
11-26 10:05:25.363: E/AndroidRuntime(28212): at android.view.View.measure(View.java:16515)
11-26 10:05:25.363: E/AndroidRuntime(28212): at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:1958)
11-26 10:05:25.363: E/AndroidRuntime(28212): at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1155)
11-26 10:05:25.363: E/AndroidRuntime(28212): at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1337)
11-26 10:05:25.363: E/AndroidRuntime(28212): at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1042)
11-26 10:05:25.363: E/AndroidRuntime(28212): at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5721)
11-26 10:05:25.363: E/AndroidRuntime(28212): at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761)
11-26 10:05:25.363: E/AndroidRuntime(28212): at android.view.Choreographer.doCallbacks(Choreographer.java:574)
11-26 10:05:25.363: E/AndroidRuntime(28212): at android.view.Choreographer.doFrame(Choreographer.java:544)
11-26 10:05:25.363: E/AndroidRuntime(28212): at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747)
11-26 10:05:25.363: E/AndroidRuntime(28212): at android.os.Handler.handleCallback(Handler.java:733)
11-26 10:05:25.363: E/AndroidRuntime(28212): at android.os.Handler.dispatchMessage(Handler.java:95)
11-26 10:05:25.363: E/AndroidRuntime(28212): at android.os.Looper.loop(Looper.java:136)
11-26 10:05:25.363: E/AndroidRuntime(28212): at android.app.ActivityThread.main(ActivityThread.java:5050)
11-26 10:05:25.363: E/AndroidRuntime(28212): at java.lang.reflect.Method.invokeNative(Native Method)
11-26 10:05:25.363: E/AndroidRuntime(28212): at java.lang.reflect.Method.invoke(Method.java:515)
11-26 10:05:25.363: E/AndroidRuntime(28212): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java)
原因是:adapter中返回的時候convertView為null.
posted @
2014-11-26 13:40 Terry Zou 閱讀(252) |
評論 (0) |
編輯 收藏
Exception:
10-24 17:43:15.112: E/AndroidRuntime(11888): java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
10-24 17:43:15.112: E/AndroidRuntime(11888): at android.view.ViewGroup.addViewInner(ViewGroup.java:3596)
10-24 17:43:15.112: E/AndroidRuntime(11888): at android.view.ViewGroup.addView(ViewGroup.java:3449)
10-24 17:43:15.112: E/AndroidRuntime(11888): at android.support.v4.view.ViewPager.addView(ViewPager.java:1305)
10-24 17:43:15.112: E/AndroidRuntime(11888): at android.view.ViewGroup.addView(ViewGroup.java:3394)
10-24 17:43:15.112: E/AndroidRuntime(11888): at android.view.ViewGroup.addView(ViewGroup.java:3370)
10-24 17:43:15.112: E/AndroidRuntime(11888): at com.zhihe.xqsh.adapter.IndexTopPagerAdapter.instantiateItem(IndexTopPagerAdapter.java:72)
10-24 17:43:15.112: E/AndroidRuntime(11888): at android.support.v4.view.PagerAdapter.instantiateItem(PagerAdapter.java:110)
10-24 17:43:15.112: E/AndroidRuntime(11888): at android.support.v4.view.ViewPager.addNewItem(ViewPager.java:833)
10-24 17:43:15.112: E/AndroidRuntime(11888): at android.support.v4.view.ViewPager.populate(ViewPager.java:1017)
10-24 17:43:15.112: E/AndroidRuntime(11888): at android.support.v4.view.ViewPager.populate(ViewPager.java:915)
10-24 17:43:15.112: E/AndroidRuntime(11888): at android.support.v4.view.ViewPager$3.run(ViewPager.java:245)
10-24 17:43:15.112: E/AndroidRuntime(11888): at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761)
10-24 17:43:15.112: E/AndroidRuntime(11888): at android.view.Choreographer.doCallbacks(Choreographer.java:574)
10-24 17:43:15.112: E/AndroidRuntime(11888): at android.view.Choreographer.doFrame(Choreographer.java:543)
10-24 17:43:15.112: E/AndroidRuntime(11888): at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747)
10-24 17:43:15.112: E/AndroidRuntime(11888): at android.os.Handler.handleCallback(Handler.java:733)
10-24 17:43:15.112: E/AndroidRuntime(11888): at android.os.Handler.dispatchMessage(Handler.java:95)
10-24 17:43:15.112: E/AndroidRuntime(11888): at android.os.Looper.loop(Looper.java:136)
10-24 17:43:15.112: E/AndroidRuntime(11888): at android.app.ActivityThread.main(ActivityThread.java:5050)
10-24 17:43:15.112: E/AndroidRuntime(11888): at java.lang.reflect.Method.invokeNative(Native Method)
10-24 17:43:15.112: E/AndroidRuntime(11888): at java.lang.reflect.Method.invoke(Method.java:515)
10-24 17:43:15.112: E/AndroidRuntime(11888): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:805)
10-24 17:43:15.112: E/AndroidRuntime(11888): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:621)
10-24 17:43:15.112: E/AndroidRuntime(11888): at dalvik.system.NativeStart.main(Native Method)
10-24 17:43:15.132: I/Process(11888): Sending signal. PID: 11888 SIG: 9
原因:
當圖片向左滑動的時候,之后執行instantiateItem方法,而不去執行刪除方法,所以出現上述異常
所以在instantiateItem方法中執行刪除操作,如下:
View child = mPageViewList.get(position);
if(child.getParent()!=null){
((ViewPager)container).removeView(child);
}
注意,在此執行了刪除操作之后,把destroyItem方法中的刪除去掉,因為,如果不去掉向左滑動的時候,會顯示為空,原因如下:打印url是進行加載View,當加載完成之后會去執行destroyItem中的方法,所以,需要把destroyItem中的刪除去掉。
10-24 17:49:14.452: W/(16419): ----zhihe---- IndextoppagerAdapter instantiateItem position:0
10-24 17:49:14.452: W/(16419): ----zhihe---- IndextoppagerAdapter instantiateItem image:http://ys.rili.com.cn/images/image/201401/0111174780.jpg
10-24 17:49:14.462: W/(16419): ----zhihe---- IndextoppagerAdapter destroyItem position:0
posted @
2014-10-24 17:53 Terry Zou 閱讀(1337) |
評論 (0) |
編輯 收藏
http://blog.csdn.net/asmcvc/article/details/9948419
舉例子:
-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontpreverify
-verbose
-dontwarn
-dontskipnonpubliclibraryclassmembers
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
-libraryjars libs/afinal-0.2.1-bin.jar
-libraryjars libs/armeabi/libBaiduMapSDK_v3_1_0.so #地圖相關的C++編譯的可執行文件(引擎)不要混淆
-libraryjars libs/armeabi/liblocSDK4d.so #定位相關的C++編譯的可執行文件(引擎)不要混淆
-libraryjars libs/afinal-0.2.1-bin.jar
-libraryjars libs/android-support-v4.jar
-libraryjars libs/android-support-v7-recyclerview.jar
-libraryjars libs/apache_httpClient_full_v43.jar
-libraryjars libs/support-annotations-21.0.0-rc1.jar
-libraryjars libs/locSDK_4.2.jar
-libraryjars libs/baidumapapi_v3_1_0.jar
-keep class com.baidu.** { *; }
-keep class vi.com.gdi.bgl.android.**{*;}
-keep public class * extends android.app.Fragment
-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.app.backup.BackupAgentHelper
-keep public class * extends android.preference.Preference
-keep public class * extends android.support.v4.**
-keep public class com.android.vending.licensing.ILicensingService
-keep class android.support.annotation.** { *; }
-keep class org.apache.http43.** { *; }
-keep class android.support.v7.widget.** { *; }
-keep class net.tsz.afinal.** { *; }
-keep class com.alibaba.fastjson.** { *; }
-keep class android.support.v4.** { *; }
-keepclasseswithmembernames class * {
native <methods>;
}
-keepclasseswithmembers class * {
public <init>(android.content.Context, android.util.AttributeSet);
}
-keepclasseswithmembers class * {
public <init>(android.content.Context, android.util.AttributeSet, int);
}
-keepclassmembers class * extends android.app.Activity {
public void *(android.view.View);
}
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
-keepclassmembers class * implements java.io.Serializable {
static final long serialVersionUID;
private static final java.io.ObjectStreamField[] serialPersistentFields;
private void writeObject(java.io.ObjectOutputStream);
private void readObject(java.io.ObjectInputStream);
java.lang.Object writeReplace();
java.lang.Object readResolve();
}
-keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
}
posted @
2014-10-21 11:37 Terry Zou 閱讀(256) |
評論 (0) |
編輯 收藏
例子如下:
1 File file = new File(filePath);
2 if(file.exists()){
3 String END = "\r\n";
4 String PREFIX = "--" ;
5 String BOUNDARY = UUID.randomUUID().toString(); //邊界標識 隨機生成
6 String CONTENT_TYPE = "multipart/form-data"; //內容類型
7
8 InputStream inputStream = null;
9 FileInputStream fileStream = null;
10 DataOutputStream dos = null;
11 HttpURLConnection conn = null;
12 try {
13 URL url = new URL(Constant.URL_SECONDHAN_TAKEPHOTOATHAND);
14 conn = (HttpURLConnection) url.openConnection();
15 /*設置時間*/
16 conn.setReadTimeout(10*1000);
17 conn.setConnectTimeout(10*1000);
18
19 /*允許Input,output,不使用Cache*/
20 conn.setDoInput(true);
21 conn.setDoOutput(true);
22 conn.setUseCaches(false);
23
24 /*設置傳送的method=POST*/
25 conn.setRequestMethod("POST");
26 conn.setRequestProperty("Connection", "Keep-Alive");
27 conn.setRequestProperty("Charset", "UTF-8");
28 conn.setRequestProperty("Content-Type", CONTENT_TYPE + ";boundary=" + BOUNDARY);
29
30 /* 設置DataOutputStream */
31 dos = new DataOutputStream(conn.getOutputStream());
32
33 StringBuffer sb = new StringBuffer();
34 sb.append(PREFIX);
35 sb.append(BOUNDARY);
36 sb.append(END);
37 /**
38 * 這里重點注意:
39 * name里面的值為服務器端需要key 只有這個key 才可以得到對應的文件
40 * filename是文件的名字,包含后綴名的 比如:abc.png
41 */
42 sb.append("Content-Disposition: form-data; name=\"UpLoadFile\"; filename=\""+file.getName()+"\""+END);
43 sb.append("Content-Type: application/x-zip-compressed; charset=utf-8"+END);
44 sb.append(END);
45 dos.write(sb.toString().getBytes());
46
47 /*取得文件的FileInputStream*/
48 fileStream = new FileInputStream(file);
49
50 /*設置每次寫入1024bytes*/
51 int bufferSize = 1024;
52 byte[] buffer = new byte[bufferSize];
53 int length = -1;
54
55 /*從文件讀取數據至緩沖區*/
56 while((length=fileStream.read(buffer))!=-1){
57 dos.write(buffer,0,length);
58 }
59 dos.write(END.getBytes());
60 byte[] end_data = (PREFIX+BOUNDARY+PREFIX+END).getBytes();
61 dos.write(end_data);
62 dos.flush();
63
64 /* 取得Response內容 */
65 InputStream is = conn.getInputStream();
66 int ch;
67 StringBuffer b =new StringBuffer();
68 while( ( ch = is.read() ) != -1 ){
69 b.append( (char)ch );
70 }
71 String result = b.toString();
72
73 } catch (SocketTimeoutException e) {
74 AgUtils.log("", " upload SocketTimeoutException");
75 mHandler.sendEmptyMessage(4);
76 e.printStackTrace();
77 } catch (ConnectTimeoutException e) {
78 AgUtils.log("", " download ConnectTimeoutException");
79 mHandler.sendEmptyMessage(4);
80 e.printStackTrace();
81 } catch (UnknownHostException e) {
82 AgUtils.log("", " download UnknownHostException");
83 mHandler.sendEmptyMessage(4);
84 e.printStackTrace();
85 } catch (MalformedURLException e) {
86 AgUtils.log("", " download MalformedURLException");
87 mHandler.sendEmptyMessage(4);
88 e.printStackTrace();
89 } catch (ProtocolException e) {
90 AgUtils.log("", " ProtocolException");
91 e.printStackTrace();
92 mHandler.sendEmptyMessage(2);
93 } catch (IOException e) {
94 AgUtils.log("", " IOException");
95 mHandler.sendEmptyMessage(0);
96 e.printStackTrace();
97 } finally {
98 XqshService.this.sendBroadcast(new Intent(INTENT_UPLOAD_COMPLETE));
99 try {
100 if (fileStream != null) {
101 fileStream.close();
102 }
103 if (inputStream != null) {
104 inputStream.close();
105 }
106 if (dos != null) {
107 dos.close();
108 }
109
110 if (conn != null) {
111 conn.disconnect();
112 conn = null;
113 }
114 } catch (IOException e) {
115 e.printStackTrace();
116 }
117 }
118 }
posted @
2014-09-11 08:16 Terry Zou 閱讀(180) |
評論 (0) |
編輯 收藏
1.建立FrameLayout,因為該布局方式只顯示下層內容,如:
1 <FrameLayout
2 xmlns:android="http://schemas.android.com/apk/res/android"
3 android:layout_width="match_parent"
4 android:layout_height="fill_parent">
5 <LinearLayout
6 android:layout_width="fill_parent"
7 android:layout_height="fill_parent"
8 android:orientation="vertical"
9 android:id="@+id/main"
10 android:background="@color/white"
11 >
12 <LinearLayout
13 android:layout_width="fill_parent"
14 android:layout_height="wrap_content"
15 >
16 <GridView
17 android:id="@+id/gridview_send"
18 android:layout_width="fill_parent"
19 android:layout_height="fill_parent"
20 android:layout_marginLeft="20dp"
21 android:layout_marginTop="40dp"
22 android:listSelector="@color/bule_overlay"
23 android:numColumns="4" >
24 </GridView>
25 </LinearLayout>
26 <ImageView
27 android:layout_width="fill_parent"
28 android:layout_height="wrap_content"
29 android:src="@drawable/service_public_diver"
30 android:layout_marginLeft="20dp"
31 android:layout_marginRight="20dp"
32 android:layout_marginTop="40px"
33 />
34 <EditText
35 android:id="@+id/issueContent"
36 android:layout_width="fill_parent"
37 android:layout_height="wrap_content"
38 android:minLines="4"
39 android:gravity="top"
40 android:layout_marginLeft="20dp"
41 android:layout_marginRight="20dp"
42 android:layout_marginTop="30px"
43 android:textColor="#e3e3e3"
44 android:hint="請輸入內容"
45 android:background="@null"
46 android:textSize="46px"/>
47 <ImageView
48 android:layout_width="fill_parent"
49 android:layout_height="wrap_content"
50 android:src="@drawable/service_public_diver"
51 android:layout_marginLeft="20dp"
52 android:layout_marginRight="20dp"
53 android:layout_marginTop="40dp"
54 />
55 </LinearLayout>
56 <LinearLayout
57 android:id="@+id/layerMask"
58 android:layout_width="fill_parent"
59 android:layout_height="fill_parent"
60 android:orientation="vertical"
61 android:background="@drawable/common_title_back"
62 android:visibility="gone">
63 </LinearLayout>
64 </FrameLayout>
2.在layerMasK中添加view內容
private LinearLayout layerMask;//遮罩層
layerMask = (LinearLayout)contentView.findViewById(R.id.layerMask);
addInnerLayout(R.layout.fragment_takephotoathand_layer,layerMask);
//設置點擊不退出遮罩層
layerMask.setOnTouchListener(new OnTouchListener(){
@Override
public boolean onTouch(View v, MotionEvent event) {
return true;
}
});
private void addInnerLayout(int layoutResID,LinearLayout view){
LayoutInflater inflater = (LayoutInflater) ((Activity) mContext).getLayoutInflater();
View CurView = inflater.inflate(layoutResID, null);
LinearLayout.LayoutParams lineparam = new LinearLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT,
RelativeLayout.LayoutParams.MATCH_PARENT);
view.addView(CurView,lineparam);
}
3.控制顯示
layerMask.setVisibility(View.VISIBLE);
posted @
2014-09-11 08:13 Terry Zou 閱讀(1241) |
評論 (0) |
編輯 收藏
一. intent.setFlags()方法中的參數值含義:
1.FLAG_ACTIVITY_CLEAR_TOP:例如現在的棧情況為:A B C D 。D此時通過intent跳轉到B,如果這個intent添加FLAG_ACTIVITY_CLEAR_TOP標記,則棧情況變為:A B。如果沒有添加這個標記,則棧情況將會變成:A B C D B。也就是說,如果添加了FLAG_ACTIVITY_CLEAR_TOP標記,并且目標Activity在棧中已經存在,則將會把位于該目標activity之上的activity從棧中彈出銷毀。這跟上面把B的Launch mode設置成singleTask類似。簡而言之,跳轉到的activity若已在棧中存在,則將其上的activity都銷掉。
2.FLAG_ACTIVITY_NEW_TASK:例如現在棧1的情況是:A B C。C通過intent跳轉到D,并且這個intent添加了FLAG_ACTIVITY_NEW_TASK標記,如果D這個Activity在Manifest.xml中的聲明中添加了Task affinity,系統首先會查找有沒有和D的Task affinity相同的task棧存在,如果有存在,將D壓入那個棧,如果不存在則會新建一個D的affinity的棧將其壓入。如果D的Task affinity默認沒有設置,則會把其壓入棧1,變成:A B C D,這樣就和不加FLAG_ACTIVITY_NEW_TASK標記效果是一樣的了。注意如果試圖從非activity的非正常途徑啟動一個activity(例見下文“intent.setFlags()方法中參數的用例”),比如從一個service中啟動一個activity,則intent比如要添加FLAG_ACTIVITY_NEW_TASK標記(編者按:activity要存在于activity的棧中,而非activity的途徑啟動activity時必然不存在一個activity的棧,所以要新起一個棧裝入啟動的activity)。簡而言之,跳轉到的activity根據情況,可能壓在一個新建的棧中。
3.FLAG_ACTIVITY_NO_HISTORY:例如現在棧情況為:A B C。C通過intent跳轉到D,這個intent添加FLAG_ACTIVITY_NO_HISTORY標志,則此時界面顯示D的內容,但是它并不會壓入棧中。如果按返回鍵,返回到C,棧的情況還是:A B C。如果此時D中又跳轉到E,棧的情況變為:A B C E,此時按返回鍵會回到C,因為D根本就沒有被壓入棧中。簡而言之,跳轉到的activity不壓在棧中。
4.FLAG_ACTIVITY_SINGLE_TOP:和Activity的Launch mode的singleTop類似。如果某個intent添加了這個標志,并且這個intent的目標activity就是棧頂的activity,那么將不會新建一個實例壓入棧中。簡而言之,目標activity已在棧頂則跳轉過去,不在棧頂則在棧頂新建activity。
二.intent.setFlags()方法中參數的用例:
很多人使用startActivity時候,會碰到如下的異常:
Caused by: android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?
都知道,Context中有一個startActivity方法,Activity繼承自Context,重載了startActivity方法。如果使用Activity的startActivity方法,不會有任何限制,而如果使用Context的startActivity方法的話,就需要開啟一個新的task(編者按:參見一.2.的編者按),遇到上面那個異常的,都是因為使用了Context的startActivity方法。解決辦法是:Java代碼中加一個flag,即intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)。這樣就可以在新的task里面啟動這個Activity了。
posted @
2014-05-28 17:43 Terry Zou 閱讀(151) |
評論 (0) |
編輯 收藏
摘要: 轉自:http://musicbox95351.iteye.com/blog/868526 比如項目為一個UserServlet,主要分三步 1 日志輸出文件log4j.xml的配置。 2 加載日志配置...
閱讀全文
posted @
2014-05-26 11:13 Terry Zou 閱讀(1420) |
評論 (0) |
編輯 收藏
- 概述NFC標簽和四類標簽的定義。
近場通訊技術的關鍵要素之一,在于NFC裝置與被動式NFC標簽溝通的能力。NFC技術的這一特征,是許多應用成為可能的關鍵
NFC標簽正在被大量生產、部署在全球若干個領域。部署的標簽已逾百萬,隨著該技術流行,NFC標簽將滲入到很多新的領域。
預測到未來將有大量標簽得到使用,標簽的定義必須清晰,已確保不同制造商的標簽與設備達到兼容。
- NFC標簽基礎
NFC標簽是被動式裝置,可用來與主動式NFC裝置(主動式NFC讀寫器)通信。標簽可用于應用之內,例如在海報、以及其他儲存小量數據并傳輸到主動式NFC裝置的場合。在海報中,起作用的部分可用來做主動設備的接觸點。
NFC標簽所含儲存的數據可為任何形式,但一般是用來貯存網址(URL)以供NFC裝置找到進一步的信息。所需數據量很少,故可使用NFC標簽。
為了定義主動式NFC讀寫器與被動式標簽之間的通信,NFC論壇在2006年6月推出了其第一個標準技術架構和NFC合規裝置的標準,包括:NFC數據交換格式(NDEF)、三種記錄類型定義(RTD),用于智能海報、文本、互聯網資源讀取應用。
- NFC標簽類型定義
定義的基本標簽類型有四種,以1至4來標識,各有不同的格式與容量。這些標簽類型格式的基礎是:ISO 14443的A與B類型、Sony FeliCa,前者是非接觸式智能卡的國際標準,而后者符合ISO 18092被動式通訊模式標準。
保持NFC標簽盡可能簡單的優勢是:在很多場合,標簽可為一次性使用,例如在海報中壽命較短的場合。
各種標簽的定義如下:
第1類標簽(Tag 1 Type):此類型基于ISO14443A標準。此類標簽具有可讀、重新寫入的能力,用戶可將其配置為只讀。存儲能力為96字節,用來存網址URL或其他小量數據富富有余。然而,內存可被擴充到2k字節。此類NFC標簽的通信速度為106 kbit/s。此類標簽簡潔,故成本效益較好,適用于許多NFC應用。
第2類標簽(Tag 2 Type):此類標簽也是基于ISO14443A,具有可讀、重新寫入的能力,用戶可將其配置為只讀。其基本內存大小為48字節,但可被擴充到2k字節。通信速度也是106 kbit/s。
第3類標簽(Tag 3 Type):此類標簽基于Sony FeliCa體系。目前具有2k字節內存容量,數據通訊速度為212 kbit/s。故此類標簽較為適合較復雜的應用,盡管成本較高。
第4類標簽(Tag 4 Type):此類標簽被定義為與ISO14443A、B標準兼容。制造時被預先設定為可讀/可重寫、或者只讀。內存容量可達32k字節,通信速度介于106 kbit/s和424 kbit/s之間。
從上述不同標簽類型的定義可以看出,前兩類與后兩類在內存容量、構成方面大不相同。故它們的應用不太可能有很多重疊。
第1與第2類標簽是雙態的,可為讀/寫或只讀。第3與第4類則是只讀,數據在生產時寫入或者通過特殊的標簽寫入器來寫入。
-NFC標簽運行
NFC標簽是無需電源的被動裝置。在使用時,用戶以具有NFC功能的設備與其接觸。標簽從讀寫器獲得很小的電源驅動標簽的電路,把小量信息傳輸到讀寫器。
標簽內存里的數據被傳至帶有NFC功能的設備。盡管數據量很小,卻可能是把設備導向到某個網址(URL)、或是小量文本、其他數據。
-NFC標簽設計與制造
標簽設計與制造需要考慮很多方面。標簽是為了大量、極低成本制造,同時保持性能。在設計標簽時,下面是需要考慮的幾個關鍵的性能參數與要素:
讀取速度:因為需要在兩個NFC裝置接近時傳輸標簽所含的所有數據,故速度很重要。如果標簽傳數據較慢,就有不能完全傳輸、可靠性差的危險。結果影響到用戶,不明白該技術的用戶,假如不得不重復多次才能奏效就會對其喪失信心。第一類NFC標簽允許所有數據整塊(block)傳輸,保持了標簽的讀取性能。
晶片尺寸:在標簽設計中,晶片尺寸(die size)具有特別的重要性。尺寸較小,則成本較低、標簽也不那么顯眼(對在海報中使用較為重要)。內存較小自然導致晶片尺寸較小。
單元價格:鑒于NFC標簽的目標應用是極低成本的(例如用于智能海報),單位價格是標簽設計極其重要的一個因素。在這里,成本至為關鍵。標簽成本受一系列因素影響,包括內存大小和所含附加特征帶來的集成電路復雜性。把內存與特征盡可能簡化,成本就能壓低。
當NFC體系真正起飛時,標簽生產量可能達到數十億的規模;需要精心設計,以在成本與性能之間取得正確的平衡。
posted @
2014-05-16 10:33 Terry Zou 閱讀(209) |
評論 (0) |
編輯 收藏
問題:按照NDEF消息格式來解析下列Hex串?
D1 02 1F 53 70 91 01 0E 54 02
65 6E 68 65 6C 6C 6F 20 77 6F
72 6C 64 51 01 09 55 01 73 69
6E 61 2E 63 6F 6D
解答:
(1)NDEF記錄格式如下,

Byte 0: D1
0xD1 = 11010001B,對應的標志位如下:
MB(Message Begin) = 1,說明這是首記錄
ME(Message End) = 1,說明這是末記錄(說明消息只有一個記錄)
CF(Chunk Flag) = 0,說明記錄未被切塊
SR(Short Record) = 1,說明這是短記錄,PAYLOAD_LENGTH 占1字節
IL(ID_LENGTH field is present) = 0,說明沒有 ID_LENGTH 和 ID 域
TNF(Type Name Format) = 1,說明TYPE類型是 NFC Forum well-known type [NFC RTD],
下表是TNF編碼對應表
因為SR=1且IL=0,所以NDEF記錄可簡化為如下結構
Byte 1: 02
TYPE_LENGTH = 2,TYPE域長度為2
Byte 2: 1F
PAYLOAD_LENGTH = 0x1F,Payload域長度為31
Byte 3-4: 53 70
TYPE = "Sp",因為TYPE域長度為2,所以此處TYPE取2個字節
此后全是PAYLOAD域的內容,因為TYPE="Sp",所以需要使用的Spec是“Smart Poster Record Type Definition”
(2)智能海報的記錄類型其實也是一個NDEF消息。沒錯,NDEF記錄的PAYLOAD域可以存放任何東西,包括嵌套NDEF消息。
智能海報的內容可以包括標題、URI、動作、圖標、大小、類型等記錄,其中URI記錄是必須有的,其他的可選,次序無所謂。
1)現在將智能海報的內容貼過來,如下
91 01 0E 54 02 65 6E 68 65 6C
6C 6F 20 77 6F 72 6C 64 51 01
09 55 01 73 69 6E 61 2E 63 6F
6D
Byte 0: 91
0x91 = 10010001B,對應的標志位如下:
MB = 1,說明這是首記錄
ME = 0,說明后面還有記錄
CF = 0,說明記錄未被切塊
SR = 1,說明這是短記錄,PAYLOAD_LENGTH 占1字節
IL = 0,說明沒有 ID_LENGTH 和 ID 域
TNF = 1,說明TYPE類型是 NFC Forum well-known type
Byte 1: 01
TYPE_LENGTH = 1,TYPE域長度為1
Byte 2: 0E
PAYLOAD_LENGTH = 0x0E,Payload域長度為14
Byte 3: 54
TYPE = "T",說明是文本記錄類型,適用“Text Record Type Definition”
Byte 4-17: 02 65 6E 68 65 6C 6C 6F 20 77 6F 72 6C 64
這是文本記錄的內容
下面對“02 65 6E 68 65 6C 6C 6F 20 77 6F 72 6C 64”按照文本記錄格式解碼。
文本記錄格式如下:

Byte 0: 02
Status = 2,由下表可知,IANA語言碼長度=2

Byte 1-2: 65 6E
ISO/IANA語言碼 = “en”,編碼為US-ASCII碼
Byte 3-13:68 65 6C 6C 6F 20 77 6F 72 6C 64
按照ASCII碼解碼可得“hello world”
至此,對海報內容的第一條NDEF記錄解碼完成,接下來是對剩余內容解碼。
2)剩余內容為“51 01 09 55 01 73 69 6E 61 2E 63 6F 6D”,同樣也是按照NDEF記錄來解碼。
Byte 0: 51
0x91 = 01010001B,對應的標志位如下:
MB = 0,說明這不是首記錄
ME = 1,說明這是末記錄
CF = 0,說明記錄未被切塊
SR = 1,說明這是短記錄,PAYLOAD_LENGTH 占1字節
IL = 0,說明沒有 ID_LENGTH 和 ID 域
TNF = 1,說明TYPE類型是 NFC Forum well-known type
Byte 1: 01
TYPE_LENGTH = 1,TYPE域長度為1
Byte 2: 09
PAYLOAD_LENGTH = 0x09,Payload域長度為9
Byte 3: 55
TYPE = "U",說明是URI記錄類型,適用“URI Record Type Definition”
Byte 4-12: 01 73 69 6E 61 2E 63 6F 6D
這是URI記錄的內容
URI記錄內容格式如下:
Byte 0: 01
ID碼 = 1,由下表可知,對應的協議是“http://www.”
Byte 1-8: 73 69 6E 61 2E 63 6F 6D
按照UTF-8格式解碼可得:“sina.com”
至此,整個NDEF消息解碼完畢。
回顧一下吧,整個結構的解碼將其如下分解:
D1 02 1F 53 70 <-- 智能海報
91 01 0E 54 02 65 6E 68 65 6C 6C 6F 20 77 6F 72 6C 64 <-- 文本
51 01 09 55 01 73 69 6E 61 2E 63 6F 6D <-- URI
posted @
2014-05-14 16:17 Terry Zou 閱讀(1841) |
評論 (0) |
編輯 收藏
摘要: AsyncTask和Handler對比
1 ) AsyncTask實現的原理,和適用的優缺點
AsyncTask,是android提供的輕量級的異步類,可以直接繼承AsyncTask,在類中實現異步操作,并提供接口反饋當前異步執行的程度(可以通過接口實現UI進度更新),最后反饋執行的結果給UI主線程.
使用的優點:
l 簡單,快捷
l 過程可控
&n...
閱讀全文
posted @
2014-05-08 17:25 Terry Zou 閱讀(176) |
評論 (0) |
編輯 收藏