2017-02-19 5 views
0

AndroidとImの新機能で、サーバへの接続を試み、Jsonレスポンスをフェッチしてクラスに解析し、使用可能にするアプリケーションです。ヌルオブジェクトリファレンスでインタフェースメソッド<MyInterfaceMethord>を呼び出そうとしました

アイブ氏は、この

  1. パブリッククラスカスタマー{}
  2. パブリッククラスServerConnect {}
  3. パブリッククラスJsonParser {}のための3つのクラスをimplimented

Serverconnectは、ダウンロードするにはバレーライブラリを使用していますAsyncスレッド上のWebページソース。ダウンロード後、Server ConnectクラスはonServerResponded(String responce)のリスナを起動します。このレスポンスは、JsonParserクラスへの入力です。 JsonParserクラスが顧客のリストを正常に取得した後、onCustomersParsed(List customers)という別のリスナーを起動します。後で行う処理は、onCustomersParsedコールバック内で実行されます。

しかし、イムは、致命的な例外のインターフェイスメソッドを呼び出すために...

試みを取得して '無効 app.utilities.JsonParser $ OnCustomersParserListner.onCustomersParsed()' nullのオブジェクト参照の

私はベストを尽くしたが、失敗する。ここに私のコードは、これは私のサーバーのConnectorクラス

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); 
    } 

} 

IS

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; 
    } 
} 

される。これは、これが主な活動から電話IS

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(); 
     } 
    } 

} 

MY JSONパーサークラスです

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(); 
    } 
}); 

誰でも助けてください

+0

MainActivityでリスナーを設定し、parseCustomersを呼び出す順序を変更してみてください。 – Sanjeet

答えて

0

リスナーを設定してから、parsingを呼び出してください。順序を変更してみてください。

@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(); 

} 
+0

なんて愚かなんだ!友よありがとう。あなたが言ったように、今はすべてうまく動作します。ありがとうございました –

関連する問題

 関連する問題