nullpointerexception - Attempt to invoke virtual method 'java.io.File android.content.Context.getCacheDir()' on a null object reference -
this question has answer here:
- what nullpointerexception, , how fix it? 12 answers
i trying use volley , send request check data after login.
have special class 'api' where's volley staff.
trying after checking validation in loginactivity (default android studio template) want create api instance in loginactivity , send request server.
testing volley, later want create 1 api instance in main class.
here's api class:
import android.app.application; import android.util.log; import com.android.volley.*; import com.android.volley.toolbox.volley; import com.android.volley.toolbox.jsonobjectrequest; import org.json.jsonobject; import java.lang.string; public class api extends application { protected string serverurl; protected string get; protected string post; protected requestqueue queue; public api(){ setserverurl("http://localhost:63424"); setget("http://localhost:63424/api"); setpost("http://localhost:63424/api"); queue = volley.newrequestqueue(this); } protected void sendget (string request) { jsonobjectrequest getrequest = new jsonobjectrequest(request.method.get, request, null, new response.listener<jsonobject>() { @override public void onresponse(jsonobject response) { // display response log.d("responseapi", response.tostring()); } }, new response.errorlistener() { @override public void onerrorresponse(volleyerror error) { log.d("error.responseapi", error.tostring()); } } ); queue.add(getrequest); } //logowanie public boolean checklogin (string login, string password){ setget(getget()+"/search_users_/login=/"+login + "/"); sendget(getget()); return true; } public string getserverurl() { return serverurl; } public void setserverurl(string serverurl) { serverurl = serverurl; } public string getget() { return get; } public void setget(string get) { this.get = get; } public string getpost() { return post; } public void setpost(string post) { this.post = post; } }
here trying create api instance in loginactivity:
public class userlogintask extends asynctask<void, void, boolean> { private final string memail; private final string mpassword; userlogintask(string email, string password) { memail = email; mpassword = password; } @override protected boolean doinbackground(void... params) { // todo: attempt authentication against network service. try { // simulate network access. thread.sleep(2000); } catch (interruptedexception e) { return false; } log.d("api", "zaraz utworze api"); api api = new api(); return api.checklogin(memail, mpassword); // todo: register new account here. } @override protected void onpostexecute(final boolean success) { mauthtask = null; showprogress(false); if (success) { finish(); } else { mpasswordview.seterror(getstring(r.string.error_incorrect_password)); mpasswordview.requestfocus(); } } @override protected void oncancelled() { mauthtask = null; showprogress(false); } }
this solution not work, error:
fatal exception: asynctask #1 process: pawel.cooker, pid: 2646 java.lang.runtimeexception: error occurred while executing doinbackground() @ android.os.asynctask$3.done(asynctask.java:353) @ java.util.concurrent.futuretask.finishcompletion(futuretask.java:383) @ java.util.concurrent.futuretask.setexception(futuretask.java:252) @ java.util.concurrent.futuretask.run(futuretask.java:271) @ android.os.asynctask$serialexecutor$1.run(asynctask.java:245) @ java.util.concurrent.threadpoolexecutor.runworker(threadpoolexecutor.java:1162) @ java.util.concurrent.threadpoolexecutor$worker.run(threadpoolexecutor.java:636) @ java.lang.thread.run(thread.java:764) caused by: java.lang.nullpointerexception: attempt invoke virtual method 'java.io.file android.content.context.getcachedir()' on null object reference @ android.content.contextwrapper.getcachedir(contextwrapper.java:256) @ com.android.volley.toolbox.volley.newrequestqueue(volley.java:43) @ com.android.volley.toolbox.volley.newrequestqueue(volley.java:78) @ pawel.cooker.api.<init>(api.java:17) @ pawel.cooker.loginactivity$userlogintask.doinbackground(loginactivity.java:320) @ pawel.cooker.loginactivity$userlogintask.doinbackground(loginactivity.java:299) @ android.os.asynctask$2.call(asynctask.java:333) @ java.util.concurrent.futuretask.run(futuretask.java:266) @ android.os.asynctask$serialexecutor$1.run(asynctask.java:245) @ java.util.concurrent.threadpoolexecutor.runworker(threadpoolexecutor.java:1162) @ java.util.concurrent.threadpoolexecutor$worker.run(threadpoolexecutor.java:636) @ java.lang.thread.run(thread.java:764)
there's problem volley, have no idea what's wrong.
there's problem volley
no, there's problem api class.
make sure put in manifest
<application android:name=".api"
after that
- don't use constructor. use
oncreate
. or, don't useapplication
, , use volley-scoped singleton -- see example documentation - replace
localhost
actual server address
public class api extends application { public static final string serverurl = "http://<use real server here>:63424"; public static final string = serverurl+"/api"; public static final string post = serverurl+"/api"; protected requestqueue queue; private final api minstance; private api() { } public api getinstance() { return minstance; } @override public void oncreate(){ super.oncreate(); minstance = this; queue = volley.newrequestqueue(this); }
- you can't
return
blocking value async functions. use callbacks pass results
protected void sendget (string url, response.listener<jsonobject> onsuccess) { jsonobjectrequest getrequest = new jsonobjectrequest(request.method.get, url, null, onsuccess, new response.errorlistener() { @override public void onerrorresponse(volleyerror error) { log.d("error.responseapi", error.tostring()); } } ); queue.add(getrequest); } public void checklogin (string login, response.listener<jsonobject> onsuccess){ sendget(get+"/search_users_/login=/"+login, onsuccess); }
- don't use
new api()
when should instead use((api) getapplicationcontext())
or above implementation,api.getinstance()
for example,
api api = api.getinstance().checklogin(memail, new response.listener<jsonobject>() { @override public void onresponse(jsonobject response) { // todo: register new account here. } });
- most importantly here, don't need asynctask when using volley. it's asynchronous
on related note, if using restful apis, retrofit might more useful
Comments
Post a Comment