編輯:關於Android編程
寫這篇文章屬於腦中一閃的一個念頭,是想著把自己做項目中遇到的一些奇怪問題和解決辦法分享出來。因為是現想,所以想到一個在更新一個吧。可能有理解錯誤的地方,望指出。
問題描述:在我們安裝完成一個app時,在安裝界面直接點擊打開。我們進入了app的首頁,這時我們按home鍵返回桌面,再點擊應用圖標,會發現沒有直接進入首頁,而是先進入了app的閃屏頁,在進入首頁。重復這一步一直如此。這時我們按back鍵返回,發現沒有直接退回桌面,而是返回到之前打開的多個首頁。但是如果一開始安裝完我們不是直接打開,而是在桌面點擊應用進入就不會這樣了。
奇奇怪怪~~
記得當時我在應用市場下載了部分應用,也有一些有同樣的問題。但是有些雖然重復打開,但雙擊退出程序將整個重復打開的關閉了。這確實也是一種方法,但是覺得不是最合理。
解決方法:
https://code.google.com/p/android/issues/detail?id=2373 http://stackoverflow.com/questions/3042420/home-key-press-behaviour/4782423我貼一下代碼
if (!isTaskRoot()) {
Intent intent = getIntent();
String action = intent.getAction();
if (intent.hasCategory(Intent.CATEGORY_LAUNCHER) && action != null && action.equals(Intent.ACTION_MAIN)) {
finish();
return;
}
}
問題描述:曾經寫過一個自定義CheckBox,結果運行在4.1的手機上消失不見了。。。你說郁悶不。寫法如下:
寫法沒有什麼問題吧,但是就是不顯示,憑空消失。當然如果我加上文字,就出來了,但是文字圖片重疊。。。
最後谷歌出了原因:大致是說4.1.2版本中CompoundButton沒有getCompoundPaddingXX。兩個版本的計算方式不一樣,4.1.2以上版本繪制文字時,會把圖片的寬度和paddingXX的寬度加上,而4.1.2版本只計算設置的paddingLeft。
知道了原因,解決方法:
問題描述:這個是在友盟的錯誤分析中報的,錯誤信息如下:
java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid view holder adapter positionViewHolder{42fb7f40 position=11 id=-1, oldPos=-1, pLpos:-1 no parent}
at android.support.v7.widget.RecyclerView$Recycler.validateViewHolderForOffsetPosition(RecyclerView.java:4801)
at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:4932)
at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:4913)
at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2029)
at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1414)
at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1377)
at android.support.v7.widget.LinearLayoutManager.scrollBy(LinearLayoutManager.java:1193)
at android.support.v7.widget.LinearLayoutManager.scrollVerticallyBy(LinearLayoutManager.java:1043)
at android.support.v7.widget.RecyclerView.scrollByInternal(RecyclerView.java:1552)
at android.support.v7.widget.RecyclerView.onTouchEvent(RecyclerView.java:2649)
at android.view.View.dispatchTouchEvent(View.java:7706)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2224)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1954)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2230)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1968)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2230)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1968)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2230)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1968)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2230)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1968)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2230)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1968)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2230)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1968)
at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2074)
at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1521)
at android.app.Activity.dispatchTouchEvent(Activity.java:2569)
at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2022)
at android.view.View.dispatchPointerEvent(View.java:7886)
at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:3967)
at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:3846)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3412)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3462)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3431)
at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3538)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3439)
at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3595)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3412)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3462)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3431)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3439)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3412)
at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:5552)
at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:5532)
at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:5503)
at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:5632)
at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185)
at android.view.InputEventReceiver.nativeConsumeBatchedInputEvents(Native Method)
at android.view.InputEventReceiver.consumeBatchedInputEvents(InputEventReceiver.java:176)
at android.view.ViewRootImpl.doConsumeBatchedInput(ViewRootImpl.java:5605)
at android.view.ViewRootImpl$ConsumeBatchedInputRunnable.run(ViewRootImpl.java:5651)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761)
at android.view.Choreographer.doCallbacks(Choreographer.java:574)
at android.view.Choreographer.doFrame(Choreographer.java:542)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5162)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:602)
從上面可以看到並沒有報到我們自己的代碼裡面來,這就很尴尬了。老辦法谷歌,找到了Drakeet大神的一篇博客,說到了我的心坎裡。
重現的方法是:使用 RecyclerView 加官方下拉刷新的時候,如果綁定的 List 對象在更新數據之前進行了 clear,而這時用戶緊接著迅速上滑 RV,就會造成崩潰,而且異常不會報到你的代碼上,屬於RV內部錯誤。初次猜測是,當你 clear 了 list 之後,這時迅速上滑,而新數據還沒到來,導致 RV 要更新加載下面的 Item 時候,找不到數據源了,造成 crash.
真是一樣一樣的,那麼解決方法大神也提供了,就是在刷新,也就是 clear 的同時,讓 RecyclerView 暫時不能夠滑動,之後再允許滑動即可。代碼就是在 RecyclerView 初始化的時候加上是否在刷新進而攔截手勢:
mRecyclerView.setOnTouchListener(
new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (mIsRefreshing) {
return true;
} else {
return false;
}
}
}
);
當然如果覺得刷新時不能滑動可以用這種方案:
public class WrapContentLinearLayoutManager extends LinearLayoutManager {
//... constructor
@Override
public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) {
try {
super.onLayoutChildren(recycler, state);
} catch (IndexOutOfBoundsException e) {
Log.e("probe", "meet a IOOBE in RecyclerView");
}
}
}
使用:
RecyclerView recyclerView = (RecyclerView)findViewById(R.id.recycler_view); recyclerView.setLayoutManager(new WrapContentLinearLayoutManager(activity, LinearLayoutManager.HORIZONTAL, false));
(1)平時為了給apk瘦身,我們會對圖片進行有損或無損的壓縮。那我平時有用到的一個有損壓縮網站tinypng,但是切記我們的9圖不要壓縮,不然會有問題。
(2)Android的透明主題需謹慎使用。
(3)for循環不要把獲得數量的代碼寫在循環當中:for(int i = 0; i <= list.size(); i ++)
(4)ListView的如果其寬度或高度被設置為wrap_content,會有性能等問題。
暫時就想起這麼多了,碼字不易,多多點贊。
androidAPP 集成微信支付
最近項目裡面需要支付功能,boos一致決定用微信支付,所以在網上查了很多資料,說的不全,完了就找以前的同事指教。算是成功集成上去了。在這裡做個總結記錄。1、在APP上集成
Android客戶端與服務端交互之登陸示例
今天了解了一下android客戶端與服務端是怎樣交互的,發現其實跟web有點類似吧,然後網上找了大神的登陸示例,是基於IntentService的 1.後台
android異步任務 訪問網絡 加載圖片 解決方案大集合
1. Handler + Thread 異步執行任務在UI線程中開啟子線程,使用Handler 發消息,通知主線程更新UI直接在UI線程中開啟子線程來更新TextView
android異步加載
本篇博客總結了慕課網關於異步加載圖片的知識要點,和大家一起分享,有感覺聽得不連貫的可以來看看。看完本篇博客,你將學習到下面的知識:1.怎樣將一個url(也可以說是一個In