首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >尝试在空对象引用上调用虚拟方法'java.io.File android.content.Context.getCacheDir()‘

尝试在空对象引用上调用虚拟方法'java.io.File android.content.Context.getCacheDir()‘
EN

Stack Overflow用户
提问于 2017-09-10 22:07:51
回答 1查看 11K关注 0票数 1

我试图使用截取和发送GET请求,以检查数据后,登录。

我有特殊级别的'API‘,所有的截击人员都在那里。

我要做的是在检查LoginActivity (默认的android模板)中的验证之后,我想在LoginActivity中创建API实例并将GET请求发送到服务器。

这只是为了测试Volley,稍后我想在某个主类中创建一个API实例。

下面是我的API类:

代码语言:javascript
复制
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;
    }

}

在这里,我试图在LoginActivity中创建API实例:

代码语言:javascript
复制
 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 a 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 the 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);
        }
    }

此解决方案不起作用,我得到一个错误:

代码语言:javascript
复制
FATAL EXCEPTION: AsyncTask #1
                                                            Process: pawel.cooker, PID: 2646
                                                            java.lang.RuntimeException: An error occurred while executing doInBackground()
                                                                at android.os.AsyncTask$3.done(AsyncTask.java:353)
                                                                at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:383)
                                                                at java.util.concurrent.FutureTask.setException(FutureTask.java:252)
                                                                at java.util.concurrent.FutureTask.run(FutureTask.java:271)
                                                                at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245)
                                                                at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
                                                                at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
                                                                at java.lang.Thread.run(Thread.java:764)
                                                             Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.io.File android.content.Context.getCacheDir()' on a null object reference
                                                                at android.content.ContextWrapper.getCacheDir(ContextWrapper.java:256)
                                                                at com.android.volley.toolbox.Volley.newRequestQueue(Volley.java:43)
                                                                at com.android.volley.toolbox.Volley.newRequestQueue(Volley.java:78)
                                                                at pawel.cooker.API.<init>(API.java:17)
                                                                at pawel.cooker.LoginActivity$UserLoginTask.doInBackground(LoginActivity.java:320)
                                                                at pawel.cooker.LoginActivity$UserLoginTask.doInBackground(LoginActivity.java:299)
                                                                at android.os.AsyncTask$2.call(AsyncTask.java:333)
                                                                at java.util.concurrent.FutureTask.run(FutureTask.java:266)
                                                                at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245) 
                                                                at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162) 
                                                                at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636) 
                                                                at java.lang.Thread.run(Thread.java:764) 

截击有问题,但不知道出了什么问题。

EN

回答 1

Stack Overflow用户

发布于 2017-09-11 03:56:05

截击有问题

不,API类有一个问题。

一定要把它放在舱单上

代码语言:javascript
复制
<application
    android:name=".API"

在那之后

  1. 不要使用构造函数。使用onCreate,不要使用Application,并使用截击范围内的单例- 参见文档中的示例
  2. 用实际的服务器地址替换localhost

代码语言:javascript
复制
public class API extends Application {

    public static final String ServerURL = "http://<Use real server here>:63424";
    public static final String GET = 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);
    }
  1. 您不能从异步函数中return阻塞值。使用回调将结果传回

代码语言:javascript
复制
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);
}
  1. 当您应该使用new API()或上面的实现时不要使用((API) getApplicationContext())API.getInstance()

例如,

代码语言:javascript
复制
API api = API.getInstance();
api.checkLogin(mEmail, new Response.Listener<JSONObject>() {
    @Override
    public void onResponse(JSONObject response) {
        // TODO: register the new account here.
    }
});
  1. 最重要的是,在使用截击时,您不需要使用AsyncTask。已经是异步的了

在一个相关的注意事项上,如果您使用的是RESTful API,那么重新配置可能会更有用

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46146000

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档