2016-02-09 1 views
1

время Take пытается вызвать JSON с Android, но проблема в том, путаница из контекста, это ошибка возвращается мнеgetApplicationContext()»на нулевую ссылку на объект с использованием залпа в неактивности

02-09 19:48:05.494 16350-16350/com.example.cesar.mybankaccess E/AndroidRuntime: FATAL EXCEPTION: main 
Process: com.example.cesar.mybankaccess, PID: 16350 
java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.Context android.content.Context.getApplicationContext()' on a null object reference 
at restful.dao.PatronSingleton.getRequestQueue(PatronSingleton.java:37) 
at restful.dao.PatronSingleton.<init>(PatronSingleton.java:25) 
at restful.dao.PatronSingleton.getInstance(PatronSingleton.java:30) 
at restful.dao.Cliente.dologin(Cliente.java:84) 
at restful.RestfulOperacional.dologin(RestfulOperacional.java:22) 
at com.example.cesar.mybankaccess.view.Login.dologin(Login.java:118) 
at com.example.cesar.mybankaccess.view.Login.access$100(Login.java:30) 
at com.example.cesar.mybankaccess.view.Login$2.onClick(Login.java:67) 
at android.view.View.performClick(View.java:5198) 
at android.view.View$PerformClick.run(View.java:21147) 
at android.os.Handler.handleCallback(Handler.java:739) 
at android.os.Handler.dispatchMessage(Handler.java:95) 
at android.os.Looper.loop(Looper.java:148) 
at android.app.ActivityThread.main(ActivityThread.java:5417) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

я не получаю исправить, я уверен, что для контекста getContext или подобное, но не может построить один

public class RestfulOperacional { 
    Cliente cliente; 

    public RestfulOperacional() { 
     cliente = new Cliente(); 
    } 

    public Object dologin(String s, String s1) { 
     return cliente.dologin(s, s1); 
    } 
} 

и класс на попытки разбора JSON

public class Cliente extends Application { 
    private String URL_JSON; 
    private static Context context; 
    private static Cliente instance = null; 

    public Cliente(Context context) { 
     this.context = context; 
    } 

    public Cliente() { 

    } 


    @Override 
    public void onCreate() { 
     super.onCreate(); 
     context = getContext(); 
    } 

    public static Context getContext() { 
     return context; 
    } 
    public static Cliente getInstance(Context context) { 
     if (instance == null) { 
      instance = new Cliente(context); 
     } 
     return instance; 
    } 
    public Cliente dologin(String s, String s1) { 
     URL_JSON = Constantes.URL_JSON + Constantes.URL_API_CLIENTE + Constantes.URL_API_CLIENTE_LOGIN; 
     // Mapeo de los pares clave-valor 
     HashMap<String, String> parametros = new HashMap(); 
     parametros.put("nif", s); 
     parametros.put("claveSeguridad", s1); 
     JsonObjectRequest jsArrayRequest = new JsonObjectRequest(
       Request.Method.POST, 
       URL_JSON, 
       new JSONObject(parametros), 
       new Response.Listener<JSONObject>() { 
        @Override 
        public void onResponse(JSONObject response) { 
         Log.i("Json", response.toString()); 
         // Manejo de la respuesta 
         //notifyDataSetChanged(); 
        } 
       }, 
       new Response.ErrorListener() { 

        @Override 
        public void onErrorResponse(VolleyError error) { 
        } 
       }); 
     PatronSingleton.getInstance(getContext()).addToRequestQueue(jsArrayRequest); 
     return null; 
    } 
} 
+0

Какая линия вызывает проблему? Можете ли вы указать, какая ссылка является нулевой? –

+0

Я добавил все tracelog – Cazs

+0

Какая строка вызывает проблему? –

ответ

7

Вы устанавливаете контекст в null и getContext возвращает это значение.

Попробуйте

public class Cliente extends Application { 

    protected static Cliente sInstance; 
    private RequestQueue mRequestQueue; 

    @Override 
    public void onCreate() { 
     super.onCreate(); 

     mRequestQueue = Volley.newRequestQueue(this); 
     sInstance = this; 
    } 

    public synchronized static Cliente getInstance() { 
     return sInstance; 
    } 

    public RequestQueue getRequestQueue() { 
     return mRequestQueue; 
    } 
} 

Кроме того, не забудьте добавить этот Application в манифесте как и в теге приложения

<application 
     android:name=".Cliente" 
     android:allowBackup="true" 
     .... 

В качестве альтернативы, так как Application extends Context в Android, вы действительно не» t нужна эта переменная ... вызывающий getApplicationContext() возвращает объект Application.


Использование - переместить запрос Volley на операцию, где вы хотите подключиться к сети для того, чтобы обновить взгляды и вещи в этом классе.

public class MainActivity extends AppCompatActivity { 

    private static String URL_JSON = "http://my.server.com/login"; 

    private ArrayAdapter<String> adapter; 
    private ListView lv; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     // use android:id="@android:id/list" in ListView XML 
     lv = (ListView) findViewById(android.R.id.list); 

     // Simple adapter to show strings 
     adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1); 
     lv.setAdapter(adapter); 

     doLogin("username?", "password?"); 
    } 

    private void doLogin(String s, String s1) { 

     HashMap<String, String> parametros = new HashMap<String, String>(); 
     parametros.put("nif", s); 
     parametros.put("claveSeguridad", s1); 

     JsonObjectRequest req = new JsonObjectRequest(
       Request.Method.POST, 
       URL_JSON, 
       new JSONObject(parametros), 
       new Response.Listener<JSONObject>() { 
        @Override 
        public void onResponse(JSONObject response) { 
         Log.i("Json", response.toString()); 
         // Manejo de la respuesta 
         adapter.add(response.toString()); 
         adapter.notifyDataSetChanged(); 
        } 
       }, 
       new Response.ErrorListener() { 

        @Override 
        public void onErrorResponse(VolleyError error) { 
         Log.e("Volley", error.getMessage()); 
        } 
       }); 

     // Start the request 
     Cliente.getInstance().getRequestQueue().add(req); 
    } 

} 
+0

я видел только обновление, но я определил следующие, <приложение андроид: allowBackup = «истинный» андроид: значок = «@ мипмап/ic_launcher» андроид: метка = «@ строка/app_name» андроид: тема = "@ style/AppTheme"> Cazs

+0

Добавить другое приложение? – Cazs

+0

Вам нужно добавить 'android: name' под тегом приложения, как показано –

-1
public static Cliente getInstance(Context context) { 
    if (instance == null) { 
     instance = new Cliente(context); 
    } 
    return instance; 
} 

Похоже, этот код, по существу, создавая петлю, где вы всегда настройки экземпляра к нулю.

+1

Это называется одноэлементным рисунком ...Не петля –

Смежные вопросы