วิธีแก้ปัญหา Unable to get Activity จาก Facebook Library
ก่อนอื่นเริ่มจากตัวเก็บ Context ใน App ของผมเป็น Singleton และ Init เก็บ Context ตอนเริ่มตั้งแต่เข้า MainApplication (Wrapper Application ที่ทำเข้ามาเอง)
ส่งผลให้ บาง Fragment ที่เรียกใช้ปุ่ม Login Facebook com.facebook.FacebookButtonBase ไม่สามารถดึง Activity จาก Context ได้ และ ThrowException ออกมาว่า Unable to get Activity (Context ที่ Init นี้ใช้ตัวเดียวทั้งระบบ)
ผมนี่นังงมอยู่นานเลย จนสุดท้ายก็ได้ความว่าผมต้องไป init Context อีกรอบในหน้า Activity ซึ่งใช้ชื่อว่า HomeActivity โดยใช้คำสั่ง
Contextor.getInstance().init(this);
หลังจาก Init ใหม่ปรากฎว่า Bug ละลายหายไป Happy Ending
Activities LaunchMode demo
เอาไว้ศึกษา Life Cycle Activity LaunchMode ของ Android ต่างๆ สำหรับผู้ที่ขี้เกียจเขียนเอง
MonkeyRunner
MonkeyRunner เป็น Test สำหรับ Android วิธีที่ผมใช้เป็นวิธีง่ายๆ คือให้มันกดมั่วๆ บนจอ ถ้า App crash ก็มานั่งแก้ Bug กันไป
ก่อนอื่นใส่ Path Environment 2 ตัวนี้ก่อน ถ้ายังไม่ได้ใส่
[Path Android Sdk]\Android\sdk\platform-tools
[Path Android Sdk]\Android\sdk\tools
แล้ว Run App ที่จะทดสอบ + เปิด CMD พิมพ์คำสั่งด้านล่าง
adb shell monkey -p com.bentoweb.pojimojimall -v 1000
1000 = ตัวเลข Event ที่จะ Inject
com.bentoweb.pojimojimall = ชื่อ Package App ที่เราจะทดสอบ
วิธีนำ json object มาใช้แบบ order ตำแหน่งเดิม
ก่อนหน้านี้ผมได้เจอปัญหาเกี่ยวกับ json object ที่ return มาจาก api
พบว่ามันไม่เรียงตามที่ server ได้ return มา
พอได้หาข้อมูล ก็เลยเจอวิธีที่จะทำให้เจ้า object ตัวนั้นเรียงตามเดิม โดยใช้ libs ที่ชื่อว่า json simple
ด้านล่างเป็น link ตัว source ที่ผมทำ demo ขึ้นมา
ใครที่เจอปัญหาเดียวกัน ลองเอาไปดูได้ครับ
Example เก็บ Array แบบ Key Value
Map<String, String> map = new HashMap<String, String>();
map.put("name", "demo");
map.put("fname", "fdemo");
// etc
map.get("name"); // returns "demo"
List<HashMap<String, String>> data = new ArrayList<HashMap<String, String>>();
data.add(0, map);
data.get(0).get("name");
เอารูปมาใส่กรอบที่ Mask เอาไว้
ImageView mImageView = (ImageView) findViewById(R.id.imageView);
Bitmap original = BitmapFactory.decodeResource(getResources(), R.drawable.moomak);
Bitmap mask = BitmapFactory.decodeResource(getResources(), R.drawable.mask);
original = getResizedBitmap(original, mask.getWidth(), mask.getHeight());
Bitmap result = Bitmap.createBitmap(mask.getWidth(), mask.getHeight(), Bitmap.Config.ARGB_8888);
Canvas mCanvas = new Canvas(result);
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
mCanvas.drawBitmap(original, 0, 0, null);
mCanvas.drawBitmap(mask, 0, 0, paint);
paint.setXfermode(null);
mImageView.setImageBitmap(result);
mImageView.setScaleType(ImageView.ScaleType.FIT_XY);
mImageView.setBackgroundResource(R.drawable.greencard);
เว็บสำหรับสร้าง Data Access Object (DAO) จาก Json response
สำหรับผู้เน้นสบายอีกแล้วครับท่าน โยน Json เข้าไป มันจะ Generate ออกมาให้เป็น Class เลย + Getter Setter พร้อมรบ
Android Parcelable การส่งผ่านข้อมูลระหว่าง Activity แบบ Class
ในตอนแรกผมใช้ Serialize ในการส่งผ่านข้อมูลเนื่องจากง่าย แค่ implement ไปก็ใช้ได้เลย
แต่ว่าข้อเสียของมันคือทำให้ช้าเพราะ Serialize เป็นการทำ Class นั้นให้ในรูปแบบ String
แล้วโยนข้าม Activity ทั้งก้อน
คราวนี้เลยมาลองใช้ของเฉพาะสำหรับ Android กันดูบ้าง
Parcelable นั้นเท่าที่ผมลองเล่น คือการส่งแค่ Data ภายใน Class ข้าม Activity กันไปมาเท่านั้น
เช่น ฝั่ง A พอจะส่ง ก็ Write ค่าออกมา แล้วโยนข้าม Activity
พออีกฝั่งรับมาก็จะเอาจะเอาข้อมูลมา Read ลงกลับที่เดิม ดูตัวอย่างแบบง่ายๆ ที่ผมลองทำได้ที่ Url ด้านล่าง
Git hub:
https://github.com/Moomak/Demo-Parcelable-Android/tree/master/app
จากคำแนะนำของ Guru หลายคนก็บอกว่า Parcelable เร็วกว่า Serialize มาก เพราะฉะนั้นจำเป็นต้องศึกษานะครับ 🙂
แถมอีกนิด เว็บสำหรับ Generate Class ของเราให้กลายเป็น Parcelable