当前位置: 首页 > 知识库问答 >
问题:

尝试对空对象引用调用接口方法

暨弘懿
2023-03-14

我是Android的新手,我正在开发一个应用程序,该应用程序试图连接服务器并获取Json响应,将其解析为类并使其可用。

为此,我上了三门课

  1. 公共类顾客{}
  2. 公共类ServerConnect{}
  3. 公共类JsonParser{}

Serverconnect使用Volley库在异步线程上下载网页源代码。下载后,Server Connect类启动OnServerResponsed(String Response)listner。此响应是JsonParser类的输入。JsonParser类成功获取客户列表后,将触发另一个名为onCustomersParsed(list customers)的listner。稍后的处理在onCustomersParsed回调中完成。

但是我得到了一个致命的例外...

尝试调用接口方法“void app”。公用事业JsonParser$onCustomerSparListner。空对象引用上的onCustomersParsed()

我已经尽力了,但失败了。这是我的密码

package app.elements;

/**
 * Created by Sangeeth Nandakumar on 13-02-2017.
 */

public class Customer
{
    private String id;
    private String firstname;
    private String lastname;
    private String device;
    private String gender;

    public Customer(String id, String firstname, String lastname, String device,String gender)
    {
        this.id = id;
        this.firstname = firstname;
        this.lastname = lastname;
        this.device = device;
        this.gender = gender;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getFirstname() {
        return firstname;
    }

    public void setFirstname(String firstname) {
        this.firstname = firstname;
    }

    public String getLastname() {
        return lastname;
    }

    public void setLastname(String lastname) {
        this.lastname = lastname;
    }

    public String getDevice() {
        return device;
    }

    public void setDevice(String device) {
        this.device = device;
    }
}

这是我的服务器连接器课程

package app.utilities;

import android.content.Context;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;

/**
 * Created by Sangeeth Nandakumar on 18-02-2017.
 * Highly optimised Google's Volley driven async webpage source downloader
 */

public class ServerConnector
{
    //Member variables
    private Context context;

    //Override interfaces
    public interface OnServerStatusListner
    {
        public void onServerResponded(String responce);
        public void onServerRevoked();
    }

    //New listner
    private OnServerStatusListner listner;

    //Listner function
    public void setOnServerStatusListner(OnServerStatusListner myststus)
    {
        listner=myststus;
    }

    //Constructor
    public ServerConnector(Context context)
    {
        this.context = context;
    }

    //Connect to server
    public void connectServer(String url)
    {
        //Create a request queue
        RequestQueue queue= Volley.newRequestQueue(context);
        //Tunnel the request
        StringRequest stringRequest=new StringRequest(Request.Method.GET, url,
                //When request success
                new Response.Listener<String>()
                {
                    @Override
                    public void onResponse(String response)
                    {
                        listner.onServerResponded(response);
                    }
                },
                //When request fails
                new Response.ErrorListener()
                {
                    @Override
                    public void onErrorResponse(VolleyError error)
                    {
                        listner.onServerRevoked();
                    }
                });
        //Add the request to queue
        queue.add(stringRequest);
    }

}

这是我的JSON-PARSER类

package app.utilities;

import android.content.Context;
import android.widget.Toast;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.List;
import app.elements.Customer;

/**
 * Created by Sangeeth Nandakumar on 18-02-2017.
 * Highly optimised Json parserclass with multiple listners
 */

public class JsonParser
{
    //Data members
    private Context context;
    private String jsontext;
    private List<Customer> customers=new ArrayList<>();

    //Listner object
    public OnCustomersParserListner listner;

    //Listners
    public interface OnCustomersParserListner
    {
        public void onCustomersParsed(List<Customer> customers);
    }

    //On Jsonparse listner
    public void setOnJsonParseListner(OnCustomersParserListner mylistner)
    {
        listner=mylistner;
    }

    //Constructor
    public JsonParser(Context context, String jsontext)
    {
        this.context = context;
        this.jsontext = jsontext;
    }

    //Json pre-parsing
    public void parseCustomers()
    {
        // If json is true
        if (jsontext != null)
        {
            try
            {
                //Create a JSON object
                JSONObject jsonObj = new JSONObject(jsontext);
                // Getting JSON Array node
                JSONArray json = jsonObj.getJSONArray("details");
                // Looping through All Contacts
                for (int i = 0; i < json.length(); i++)
                {
                    JSONObject details = json.getJSONObject(i);
                    //Get all customer details from JSON file
                    String id = details.getString("id");
                    String firstname = details.getString("firstname");
                    String lastname = details.getString("lastname");
                    String device = details.getString("device");
                    String gender = details.getString("gender");
                    //Add to list
                    customers.add(new Customer(id,firstname,lastname,device,gender));
                }
                listner.onCustomersParsed(customers);
            }
            catch (final JSONException e)
            {
                Toast.makeText(context, "Error in parsing JSON", Toast.LENGTH_SHORT).show();
            }
        }
        else
        {
            Toast.makeText(context, "JSON text is empty", Toast.LENGTH_SHORT).show();
        }
    }

}

这是来自主活动的呼叫

ServerConnector server=new ServerConnector(this);
server.connectServer("http://amazinginside.esy.es/customerlist.php");

server.setOnServerStatusListner(new ServerConnector.OnServerStatusListner()
{
    @Override
    public void onServerResponded(String responce)
    {
        Toast.makeText(MainActivity.this, "Server responded",      Toast.LENGTH_SHORT).show();
        JsonParser parser=new JsonParser(getApplicationContext(),responce);
        parser.parseCustomers();
        parser.setOnJsonParseListner(new JsonParser.OnCustomersParserListner() {
            @Override
            public void onCustomersParsed(List<Customer> customers) {
                Toast.makeText(MainActivity.this, customers.get(0).getFirstname(), Toast.LENGTH_SHORT).show();
            }
        });

    }
    @Override
    public void onServerRevoked()
    {
        Toast.makeText(MainActivity.this, "Connection to server broke", Toast.LENGTH_SHORT).show();
    }
});

谁能帮帮我

共有1个答案

胡利
2023-03-14

您正在设置侦听器,然后调用解析。试着改变一下顺序。

@Override
public void onServerResponded(String responce)
{
    Toast.makeText(MainActivity.this, "Server responded",      Toast.LENGTH_SHORT).show();
    JsonParser parser=new JsonParser(getApplicationContext(),responce);
    parser.setOnJsonParseListner(new JsonParser.OnCustomersParserListner() {
        @Override
        public void onCustomersParsed(List<Customer> customers) {
            Toast.makeText(MainActivity.this, customers.get(0).getFirstname(), Toast.LENGTH_SHORT).show();
        }
    });
    parser.parseCustomers();

}
 类似资料:
  • 我正在开发一个具有蓝牙功能的应用程序。我使用一个片段来扫描并列出蓝牙设备。单击时,会回调到提供所选蓝牙设备的主要活动。 我一开始使用的是Android 6(API 23)的智能手机,然后不得不调整代码以适应Android 5.0(API 21)的使用。 我只是将minSDK更改为API21并重新构建了项目,没有任何问题。 该应用程序在智能手机上运行时没有任何问题。安装了Android5的平板电脑运

  • 我的应用程序有问题,我想解决它,但我无法访问解决方案,请帮助我,,,

  • 我将使用库,并尝试在应用程序启动时使用以下方法获取令牌。 应用程序在发布时崩溃 AndroidManifest Build.Gradle: 此外,我尝试在SharedPreferences中缓存令牌,但似乎从未调用onNewToken()。 会有什么问题?

  • 我正在尝试实现一个外部色轮,它应该出现在的片段一直在崩溃我的应用程序。我想我明白为什么会发生这种情况,但是在尝试修复它大约6个小时后,我就要放弃了。我知道之前有人问过这个问题,但是我无法为我的特定问题导出一个修复程序。下面是我的代码: 这是Logcat错误: 如果有人能帮我解决这个问题,那就太好了。提前谢谢^^ 编辑:这是我的XML,按要求:

  • 我将要制作android应用程序,但是由于致命的异常:main java.lang.NullPointerException应用程序没有保存数据,请在这里帮助我 这是我的EditNoteActivity 这是我的Logcat错误

  • 我正在使用下面的代码从playstore中获取versionName,通过使用jsoup,我正在获取详细信息,但它会引发一些异常。 我的密码是 请有人帮我解决这个问题。