2017-02-17 36 views
0

我遇到了一個與我的android項目有關的問題。它在調試模式下似乎很好,但在發佈模式下崩潰。我在我的項目中使用了Firebase和Google帳戶註冊。當我試圖在註冊後從數據庫獲取數據時,應用程序崩潰。我在我的firebase控制檯中添加了釋放鍵的SHA-1和SHA-256指紋,並在我的項目中更改了google-services.json文件。我不明白我做錯了什麼。錯誤:發佈構建的應用程序不起作用

java.lang.RuntimeException: java.lang.NoSuchMethodException: <init> [class android.view.View] 
                at com.firebase.ui.database.FirebaseRecyclerAdapter.onCreateViewHolder(FirebaseRecyclerAdapter.java:165) 
                at android.support.v7.widget.RecyclerView$Adapter.createViewHolder(RecyclerView.java:6319) 
                at android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:5507) 
                at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5392) 
                at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5388) 
                at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2149) 
                at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1533) 
                at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1496) 
                at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:593) 
                at android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3535) 
                at android.support.v7.widget.RecyclerView.onMeasure(RecyclerView.java:2979) 
                at android.view.View.measure(View.java:17637) 
                at android.widget.RelativeLayout.measureChild(RelativeLayout.java:698) 
                at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:482) 
                at android.view.View.measure(View.java:17637) 
                at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5536) 
                at android.widget.FrameLayout.onMeasure(FrameLayout.java:436) 
                at android.view.View.measure(View.java:17637) 
                at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5536) 
                at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1436) 
                at android.widget.LinearLayout.measureVertical(LinearLayout.java:722) 
                at android.widget.LinearLayout.onMeasure(LinearLayout.java:613) 
                at android.view.View.measure(View.java:17637) 
                at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5536) 
                at android.widget.FrameLayout.onMeasure(FrameLayout.java:436) 
                at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2618) 
                at android.view.View.measure(View.java:17637) 
                at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2019) 
                at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1152) 
                at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1383) 
                at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1065) 
                at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5901) 
                at android.view.Choreographer$CallbackRecord.run(Choreographer.java:767) 
                at android.view.Choreographer.doCallbacks(Choreographer.java:580) 
                at android.view.Choreographer.doFrame(Choreographer.java:550) 
                at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:753) 
                at android.os.Handler.handleCallback(Handler.java:739) 
                at android.os.Handler.dispatchMessage(Handler.java:95) 
                at android.os.Looper.loop(Looper.java:211) 
                at android.app.ActivityThread.main(ActivityThread.java:5389) 
                at java.lang.reflect.Method.invoke(Native Method) 
                at java.lang.reflect.Method.invoke(Method.java:372) 
                at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1020) 
                at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:815) 
               Caused by: java.lang.NoSuchMethodException: <init> [class android.view.View] 
                at java.lang.Class.getConstructor(Class.java:531) 
                at java.lang.Class.getConstructor(Class.java:495) 
                at com.firebase.ui.database.FirebaseRecyclerAdapter.onCreateViewHolder(FirebaseRecyclerAdapter.java:162) 
                at android.support.v7.widget.RecyclerView$Adapter.createViewHolder(RecyclerView.java:6319)  
                at android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:5507)  
                at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5392)  
                at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5388)  
                at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2149)  
                at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1533)  
                at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1496)  
                at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:593)  
                at android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3535)  
                at android.support.v7.widget.RecyclerView.onMeasure(RecyclerView.java:2979)  
                at android.view.View.measure(View.java:17637)  
                at android.widget.RelativeLayout.measureChild(RelativeLayout.java:698)  
                at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:482)  
                at android.view.View.measure(View.java:17637)  
                at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5536)  
                at android.widget.FrameLayout.onMeasure(FrameLayout.java:436)  
                at android.view.View.measure(View.java:17637)  
                at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5536)  
                at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1436)  
                at android.widget.LinearLayout.measureVertical(LinearLayout.java:722)  
                at android.widget.LinearLayout.onMeasure(LinearLayout.java:613)  
                at android.view.View.measure(View.java:17637)  
                at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5536)  
                at android.widget.FrameLayout.onMeasure(FrameLayout.java:436)  
                at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2618)  
                at android.view.View.measure(View.java:17637)  
                at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2019)  
                at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1152)  
                at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1383)  
                at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1065)  
                at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5901)  
                at android.view.Choreographer$CallbackRecord.run(Choreographer.java:767)  
                at android.view.Choreographer.doCallbacks(Choreographer.java:580)  
                at android.view.Choreographer.doFrame(Choreographer.java:550)  
                at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:753)  
                at android.os.Handler.handleCallback(Handler.java:739)  
                at android.os.Handler.dispatchMessage(Handler.java:95)  
                at android.os.Looper.loop(Looper.java:211)  
                at android.app.ActivityThread.main(ActivityThread.java:5389)  
                at java.lang.reflect.Method.invoke(Native Method)  
                at java.lang.reflect.Method.invoke(Method.java:372)  
                at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1020)  
                at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:815)  

我還使用customview在我的項目 - de.hdodenhof.circleimageview.CircleImageView

public class GroupAdapter extends RecyclerView.Adapter<GroupAdapter.MyViewHolderGroup> { 

private List<GroupItem> mGroupItems; 

public static class MyViewHolderGroup extends RecyclerView.ViewHolder{ 
    TextView group_name; 
    LinearLayout mLayout; 
    MyViewHolderGroup(View view) { 
     super(view); 
     group_name = (TextView) view.findViewById(R.id.group_card_text); 
     mLayout = (LinearLayout)view.findViewById(R.id.field_of_push); 
    } 
} 
public GroupAdapter(List<GroupItem> groupList) { 
    this.mGroupItems = groupList; 
} 
@Override 
public GroupAdapter.MyViewHolderGroup onCreateViewHolder(ViewGroup parent, int viewType) { 
    View itemView = LayoutInflater.from(parent.getContext()) 
      .inflate(R.layout.group_card, parent, false); 
    return new GroupAdapter.MyViewHolderGroup(itemView); 
} 
@Override 
public void onBindViewHolder(final GroupAdapter.MyViewHolderGroup holder, int position) { 
    GroupItem group = mGroupItems.get(position); 
    holder.group_name.setText(group.getGroupname()); 
} 
@Override 
public int getItemCount() { 
    return mGroupItems.size(); 
} 
} 

的build.gradle

apply plugin: 'com.android.application' 

android { 
compileSdkVersion 25 
buildToolsVersion "23.0.3" 
defaultConfig { 
    applicationId "com.example.nix.cathedraist" 
    minSdkVersion 16 
    targetSdkVersion 25 
    versionCode 1 
    versionName "1.0" 
    testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 
    multiDexEnabled true 
} 
buildTypes { 
    release { 
     minifyEnabled false 
     proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
    } 
} 
} 

dependencies { 
compile fileTree(dir: 'libs', include: ['*.jar']) 
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { 
    exclude group: 'com.android.support', module: 'support-annotations' 
}) 
compile 'com.android.support:appcompat-v7:25.1.1' 
compile 'com.android.support:design:25.1.1' 
compile 'com.android.support:recyclerview-v7:25.1.1' 
compile 'com.google.firebase:firebase-database:10.2.0' 
compile 'com.firebaseui:firebase-ui-database:0.4.0' 
compile 'com.google.firebase:firebase-auth:10.2.0' 
compile 'com.google.android.gms:play-services-auth:10.2.0' 
compile 'de.hdodenhof:circleimageview:2.1.0' 
compile 'com.github.bumptech.glide:glide:3.7.0' 
compile 'com.android.support:multidex:1.0.1' 
testCompile 'junit:junit:4.12' 
} 
apply plugin: 'com.google.gms.google-services' 
+0

你需要的,如果你想幫助 –

回答

1

Probable causes

There are two likely causes for this:

  1. make sure that your ViewHolder class is public
  2. if your ViewHolder is an inner class of e.g. your activity, make sure it's static

And a little more

The ViewHolder (and POJO class) only have to be static if you embed them into another class.

For inner classes, the Java compiler generates an hidden field (and a constructor that takes that field) to keep a reference to the containing object, so that you can do things like MainActivity.this in instances of the inner class. This hidden field/parameter makes it difficult for the reflection code in Firebase/FirebaseUI to find the correct constructor.

Marking the class as static removes the implicit field/parameter, so things work normally again. Alternatively you can just put the CommentViewHolder in its own file CommentViewHolder.java.

更新:對不起,我已經錯過了問題發佈/調試的一部分。可能原因是混淆(proguard)。保持ViewHolder類。

更新2:ViewHolder構造應該是公衆過於
FirebaseRecyclerAdapter Give NoSuchMethodException If Build using Release Keystore

+0

我ViewHolder是公共的和靜態類 – YungBlade

+0

發佈一些相關的代碼@CookieMnstr是的,對不起,我更新了已經回答。 –

+0

我覺得Proguard不是bug的原因。我將minifyEnabled設置爲false,並得到了相同的結果。 – YungBlade

相關問題