简体   繁体   English

改进:java.lang.NullPointerException

[英]Retrofit: java.lang.NullPointerException

NullPointerException and No adapter attached; NullPointerException并且没有连接适配器; skipping layout occurs everytime I test this app on the gennymotion.i have read other questions related to same problem but none help. 每次我在gennymotion.net上测试该应用程序时,都会发生布局跳变。我已经阅读了与同一问题相关的其他问题,但没有帮助。

logcat 日志猫

09-20 13:21:13.738 4658-4658/com.example.kiran.detailapp E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.kiran.detailapp, PID: 4658 java.lang.NullPointerException: Attempt to invoke interface method 'int java.util.List.size()' on a null object reference at com.example.kiran.detailapp.RecyclerAdapter.getItemCount(RecyclerAdapter.java:38) at android.support.v7.widget.RecyclerView.dispatchLayoutStep1(RecyclerView.java:3493) at android.support.v7.widget.RecyclerView.onMeasure(RecyclerView.java:3019) at android.view.View.measure(View.java:17430) at android.widget.RelativeLayout.measureChild(RelativeLayout.java:697) at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:481) at android.view.View.measure(View.java:17430) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463) at android.widget.FrameLayout.onMeasure(FrameLayout.java:430) at android.support.v7.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:139) at android.view.View.measure(View.j 09-20 13:21:13.738 4658-4658 / com.example.kiran.detailapp E / AndroidRuntime:致命例外:主进程:com.example.kiran.detailapp,PID:4658 java.lang.NullPointerException:尝试调用接口com.example.kiran.detailapp.RecyclerAdapter.getItemCount(RecyclerAdapter.java:38)上的NULL对象引用上的方法'int java.util.List.size()',位于android.support.v7.widget.RecyclerView.dispatchLayoutStep1( android.support.v7.widget上的RecyclerView.java:3493)android.widget.RelativeLayout.measureChild(RelativeLayout)上android.view.View.measure(View.java:17430)上的RecyclerView.onMeasure(RecyclerView.java:3019) .java:697)android.widget.RelativeLayout.onMeasure(RelativeLayout.java:481)android.view.View.measure(View.java:17430)android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463)在android.widget.FrameLayout.onMeasure(FrameLayout.java:430)在android.support.v7.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:139)在android.view.View.measure(View.j) ava:17430) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463) at android.support.v7.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:393) at android.view.View.measure(View.java:17430) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463) at android.widget.FrameLayout.onMeasure(FrameLayout.java:430) at android.view.View.measure(View.java:17430) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463) 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:17430) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463) at android.widget.FrameLayout.onMeasure(FrameLayout.java:430) at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2560) at android.view.View.measure(View.java:1743 ava:17430)在android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463)在android.support.v7.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:393)在android.view.View.measure(View.java :17430),位于android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463),位于android.widget.FrameLayout.onMeasure(FrameLayout.java:430),位于android.view.View.measure(View.java:17430) .view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463)在android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1436)在android.widget.LinearLayout.measureVertical(LinearLayout.java:722)在android.widget.LinearLayout。在android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463)在android.view.View.measure(View.java:17430)在android.widget.FrameLayout.onMeasure(FrameLayout.java :430),位于com.android.internal.policy.impl.PhoneWindow $ DecorView.onMeasure(PhoneWindow.java:2560),位于android.view.View.measure(View.java:1743 0) at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2001) at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1166) at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1372) at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1054) at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5779) 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:135) at android.app.ActivityThread.main(ActivityThread.java:5221) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAnd 0)在android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2001)在android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1166)在android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1372)在android。 android.view.View.ViewRootImpl $ TraversalRunnable.run(ViewRootImpl.java:5779)的view.ViewRootImpl.doTraversal(ViewRootImpl.java:1054)android.view.Choreographer $ CallbackRecord.run(Choreographer.java:767) android.view.Choreographer.doCallbacks(Choreographer.java:580).android.view.Choreographer $ FrameDisplayEventReceiver.run(Choreographer.java:753)上的Choreographer.doFrame(Choreographer.java:550)。 android.os.Handler.dispatchMessage(Handler.java:95)的handleCallback(Handler.java:739)android.app.ActivityThread.main(ActivityThread.java)的android.os.Looper.loop(Looper.java:135)的handleCallback(Handler.java:739) :5221),位于java.lang.reflect.Method.invoke(本机方法),位于com.android.internal.os.ZygoteInit $ MethodAnd处的java.lang.reflect.Method.invoke(Method.java:372) ArgsCaller.run(ZygoteInit.java:899) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)上的ArgsCaller.run(ZygoteInit.java:899)

Contact.java Contact.java

package com.example.kiran.detailapp;
import com.google.gson.annotations.SerializedName;
public class Contact {
    @SerializedName("name")
    private String Name;

    @SerializedName("email")
    private String Email;

    public String getName() {
        return Name;
    }

    public void setName(String name) {
        Name = name;
    }

    public String getEmail() {
        return Email;
    }

    public void setEmail(String email) {
        Email = email;
    }
}

ApiClient.java ApiClient.java

    package com.example.kiran.detailapp;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;

public class ApiClient {

    public static final String BASE_URL = "http://10.0.3.2/ContactApp/";

    public static Retrofit retrofit = null;

    public static Retrofit getApiClient()
    {
        retrofit = new Retrofit.Builder().baseUrl(BASE_URL)
                .addConverterFactory(GsonConverterFactory.create()).build();
        return retrofit;
    }
}

ApiInterface.java ApiInterface.java

    package com.example.kiran.detailapp;

import java.util.List;

import retrofit2.Call;
import retrofit2.http.POST;
public interface ApiInterface {


    @POST("ReadContacts.php")
    Call<List<Contact>> getContacts();
}

RecyclerAdapter.java RecyclerAdapter.java

    package com.example.kiran.detailapp;

import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import org.w3c.dom.Text;

import java.util.List;

public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.MyViewHolder> {

    private List<Contact> contacts;
    public RecyclerAdapter(List<Contact> contacts)
    {
        this.contacts = contacts;
    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_item,parent,false);
        return new MyViewHolder(view);
    }

    @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {
        holder.Name.setText(contacts.get(position).getName());
        holder.Email.setText(contacts.get(position).getEmail());
    }

    @Override
    public int getItemCount() {
        return contacts.size();
    }

    public class MyViewHolder extends RecyclerView.ViewHolder {
        TextView Name,Email;
        public MyViewHolder(View itemView) {
            super(itemView);
            Name = (TextView) itemView.findViewById(R.id.name);
            Email = (TextView) itemView.findViewById(R.id.email);

        }
    }
}

MainActivity.java MainActivity.java

    package com.example.kiran.detailapp;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;

import java.util.List;

import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;

public class MainActivity extends AppCompatActivity {

    private RecyclerView recyclerView;
    private RecyclerView.LayoutManager layoutManager;
    private RecyclerAdapter adapter;
    private List<Contact> contacts;
    private ApiInterface apiInterface;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        adapter = new RecyclerAdapter(contacts);
        recyclerView = (RecyclerView) findViewById(R.id.Recycleview);
        layoutManager = new LinearLayoutManager(this);
        recyclerView.setLayoutManager(layoutManager);
        recyclerView.setHasFixedSize(true);

        apiInterface = ApiClient.getApiClient().create(ApiInterface.class);
        Call<List<Contact>> call = apiInterface.getContacts();
        call.enqueue(new Callback<List<Contact>>() {
            @Override
            public void onResponse(Call<List<Contact>> call, Response<List<Contact>> response) {
                contacts = response.body();

                recyclerView.setAdapter(adapter);
                adapter.notifyDataSetChanged();
            }

            @Override
            public void onFailure(Call<List<Contact>> call, Throwable t) {

            }
        });
    }
}

You forgot to initialize the arraylist 您忘了初始化arraylist

 private List<Contact> contacts;

then in onCreate() do this 然后在onCreate()执行此操作

contacts= new ArrayList<>();

I see some issues in the code. 我在代码中看到了一些问题。

1) your contacts var is going un initialized inside the adapter. 1)您的contacts var在适配器内部未初始化。

2) You have set recyclerview inside onResponse method which is running in background thread. 2)您已经在后台线程中运行的onResponse方法中设置了recyclerview。

Solution: 解:

You need to initialize contacts and then give them values in onResponse method and set adapter on activity's runOnUiThread method. 您需要初始化联系人,然后在onResponse方法中为它们提供值,并在activity's runOnUiThread方法上设置适配器。

Hope this code will help. 希望这段代码对您有所帮助。

1) initialise contacts 1)初始化联系人

private List<Contact> contacts = new ArrayList<>();

2) give expected values in onResponse method and initialize adapter there and remove initialization form onCreate method. 2)在onResponse方法中给出期望值,并在onResponse初始化适配器,并从onCreate方法中删除初始化形式。

call.enqueue(new Callback<List<Contact>>() {
        @Override
        public void onResponse(Call<List<Contact>> call, Response<List<Contact>> response) {
            contacts = response.body();
            adapter = new RecyclerAdapter(contacts);
            runOnUiThread(() -> {
                recyclerView.setAdapter(adapter);
                adapter.notifyDataSetChanged();
            });

        }

        @Override
        public void onFailure(Call<List<Contact>> call, Throwable t) {

        }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM