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

使用截取内存错误的递归函数

傅阳
2023-03-14

我正在使用Volley库与我的数据库通信。我使用递归函数连续检查数据库,但一段时间后,递归函数似乎停止工作,我得到以下错误:

FATAL EXCEPTION: main
 Process: com.example.sakis.loginregister, PID: 22637
 java.lang.OutOfMemoryError: pthread_create (stack size 131072 bytes) failed: Try again
     at java.lang.VMThread.create(Native Method)
     at java.lang.Thread.start(Thread.java:1029)
     at com.android.volley.RequestQueue.start(RequestQueue.java:145)
     at com.android.volley.toolbox.Volley.newRequestQueue(Volley.java:66)
     at com.android.volley.toolbox.Volley.newRequestQueue(Volley.java:78)
     at com.example.sakis.loginregister.MultiPlayerActivity.func(MultiPlayerActivity.java:342)
     at com.example.sakis.loginregister.MultiPlayerActivity$2.onResponse(MultiPlayerActivity.java:160)
     at com.example.sakis.loginregister.MultiPlayerActivity$2.onResponse(MultiPlayerActivity.java:133)
     at com.android.volley.toolbox.StringRequest.deliverResponse(StringRequest.java:60)
     at com.android.volley.toolbox.StringRequest.deliverResponse(StringRequest.java:30)
     at com.android.volley.ExecutorDelivery$ResponseDeliveryRunnable.run(ExecutorDelivery.java:99)
     at android.os.Handler.handleCallback(Handler.java:808)
     at android.os.Handler.dispatchMessage(Handler.java:103)
     at android.os.Looper.loop(Looper.java:193)
     at android.app.ActivityThread.main(ActivityThread.java:5292)
     at java.lang.reflect.Method.invokeNative(Native Method)
     at java.lang.reflect.Method.invoke(Method.java:515)
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:824)
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:640)
     at dalvik.system.NativeStart.main(Native Method)

如果我没有及时得到正确的响应,我认为这是一个堆栈溢出错误。下面是我在onCreate方法中首次调用的递归函数代码:

void func(){

    reject=0;
    Response.Listener<String> response1Listener = new Response.Listener<String>() {
        @Override
        public void onResponse(final String response) {


            try {


                JSONObject jsonResponse = new JSONObject(response);

                request = jsonResponse.getInt("request");
                requestorigin = jsonResponse.getString("requestorigin");
                category = jsonResponse.getInt("category");
                dif_level = jsonResponse.getInt("dif_level");
                number_of_questions = jsonResponse.getInt("number_of_questions");
                time_of_answer = jsonResponse.getInt("time_of_answer");

                if(request==0)  {





                    func();

                }

                if (request == 1) {



                    AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(MultiPlayerActivity.this,R.style.myBackgroundStyle);
                    alertDialogBuilder.setMessage("Έχεις νέο αίτημα από τον χρήστη " + requestorigin + "\n" + "Κατηγορία Ερωτήσεων: " + array_category[category]
                            + "\n" + "Επίπεδο Δυσκολίας: " + array_dif_level[dif_level] + "\n" + "Αριθμός Ερωτήσεων: " + number_of_questions + "\n "
                            + "Χρόνος Απάντησης: " + time_of_answer);

                    alertDialogBuilder.setPositiveButton("Ναι", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface arg0, int arg1) {


                            Response.Listener<String> response1Listener = new Response.Listener<String>() {
                                @Override
                                public void onResponse(final String response) {


                                    try {


                                        JSONObject jsonResponse = new JSONObject(response);


                                    } catch (JSONException e)

                                    {

                                        e.printStackTrace();
                                    }


                                }


                            };


                            SendResponseRequest sendResponseRequest = new SendResponseRequest(username, response1Listener);
                            RequestQueue queue1 = Volley.newRequestQueue(MultiPlayerActivity.this);
                            queue1.add(sendResponseRequest);



                            Response.Listener<String> responseListener=new Response.Listener<String>() {
                                @Override
                                public void onResponse(String response) {

                                    try {
                                        JSONObject jsonResponse = new JSONObject(response);
                                        boolean success1=jsonResponse.getBoolean("success1");
                                        if(success1)  {
                                            Intent intent2 = new Intent(MultiPlayerActivity.this, MultiPlayerGame2Activity.class);
                                            intent2.putExtra("username1",username);
                                            intent2.putExtra("username2",requestorigin);
                                            intent2.putExtra("category", category);
                                            intent2.putExtra("dif_level", dif_level);
                                            intent2.putExtra("number_of_questions", number_of_questions);
                                            intent2.putExtra("time_of_answer", time_of_answer);
                                            intent2.putExtra("level", level);
                                            intent2.putExtra("score", score);
                                            intent2.putExtra("music",music);
                                            intent2.putExtra("sound",sound);
                                            startActivity(intent2);
                                            // android.os.Process.killProcess(android.os.Process.myPid());
                                            finish();
                                        }

                                    } catch (JSONException e)

                                    {

                                        e.printStackTrace();
                                    }


                                }
                            };




                            Back0Request back0Request = new Back0Request(username,responseListener);
                            RequestQueue queue = Volley.newRequestQueue(MultiPlayerActivity.this);
                            queue.add(back0Request);








                        }
                    });

                    alertDialogBuilder.setNegativeButton("Όχι", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {




                                    Response.Listener<String> response1Listener = new Response.Listener<String>() {
                                        @Override
                                        public void onResponse(final String response) {


                                            try {


                                                JSONObject jsonResponse = new JSONObject(response);
                                                reject = jsonResponse.getInt("reject");
                                                if(reject==1)  {
                                                    func();
                                                }

                                            } catch (JSONException e)

                                            {

                                                e.printStackTrace();
                                            }


                                        }


                                    };


                                    RejectRequestRequest rejectRequestRequest = new RejectRequestRequest(username, response1Listener);
                                    RequestQueue queue1 = Volley.newRequestQueue(MultiPlayerActivity.this);
                                    queue1.add(rejectRequestRequest);





                                        }

                    });


                    AlertDialog alertDialog = alertDialogBuilder.create();
                    alertDialog.show();




                }





            } catch (JSONException e)

            {

                e.printStackTrace();
            }


        }


    };


    //text2.setText("OK");
    CheckRequest checkRequest = new CheckRequest(username, response1Listener);
    /***
     int socketTimeout = 30000;//30 seconds - change to what you want
     RetryPolicy policy = new DefaultRetryPolicy(socketTimeout, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT);
     checkRequest.setRetryPolicy(policy);
     ******/
    RequestQueue queue1 = Volley.newRequestQueue(MultiPlayerActivity.this);
    queue1.add(checkRequest);

    //text3.setText("After ");

}

当我从数据库中获取的变量请求值为零时,我想再次检查数据库,直到它取非零值。有没有更好的方法来实现这一点,这样我就可以避免递归,因为它会导致一些溢出错误。

共有1个答案

窦华晖
2023-03-14

问题解决了,当我使用单例模式和重复使用队列的相同实例,所以我防止内存溢出错误:

public class MySingleton {
private static MySingleton mInstance;
private RequestQueue mRequestQueue;
private static Context mContext;

private MySingleton(Context context){
    // Specify the application context
    mContext = context;
    // Get the request queue
    mRequestQueue = getRequestQueue();
}

public static synchronized MySingleton getInstance(Context context){
    // If Instance is null then initialize new Instance
    if(mInstance == null){
        mInstance = new MySingleton(context);
    }
    // Return MySingleton new Instance
    return mInstance;
}

public RequestQueue getRequestQueue(){
    // If RequestQueue is null the initialize new RequestQueue
    if(mRequestQueue == null){
        mRequestQueue = Volley.newRequestQueue(mContext.getApplicationContext());
    }

    // Return RequestQueue
    return mRequestQueue;
}

public<T> void addToRequestQueue(Request<T> request){
    // Add the specified request to the request queue
    getRequestQueue().add(request);
}
 类似资料:
  • 我不明白为什么我会得到这个最大深度错误。iam试图使用bst递归方法在数组中查找数字索引,下面是我的代码 任何人都可以告诉我代码块中发生了什么 错误块: PS C:\Users\admin\Desktop\DSA

  • 问题内容: 我必须用Java编写幂方法。它接收两个整数,无论​​它们是正数还是负数都没有关系。它应该具有的复杂度。它还必须使用递归。我当前的代码有两个数字,但我不断输出的结果是零,我不知道为什么。 问题答案: 让我们从一些数学事实开始: 对于正n,aⁿ=a⨯a⨯…⨯an次 对于负数n,aⁿ=⅟a⁻ⁿ=⅟(a⨯a⨯…⨯a)。这意味着 a 不能为零。 对于n = 0,即使 a 为零或负,aⁿ= 1 。

  • 问题内容: 我使用以下代码解决了Euler项目的问题10,该代码通过强力工作: 这三个功能的工作方式如下: isPrime 检查数字是否为质数; primeList 返回一个列表,其中包含一组在一定范围内且限制为“ n”的素数,并且; sumPrimes 对列表中所有数字的值求和。(不需要最后一个功能,但是我喜欢它的清晰度,特别是对于像我这样的初学者。) 然后,我编写了一个新函数 primeLis

  • 我在学校开始学习数据结构,我有一个家庭作业,我必须实现一个二叉搜索树,并告诉数据结构占用的内存。 第二个问题。假设我从10000个键中插入25000个条目。每次插入都将递归地使用,直到新节点找到它的“位置”。如何计算占用的内存?

  • 我目前正在编码一个二叉查找树,目前正在尝试实现一个递归函数来确定二叉树中是否存在一个节点。 这是节点类: 所讨论的函数是Exists函数。这是在BST的根节点上调用的,就像这样:

  • 基本上问题来自codeforces(1485A)。问题是,当我给一些大的输入,如50000000a和5b时,这会给我带来分段错误,而代码对较小的输入很好。请帮我解决。