Android - SQL每1秒查询2分钟

时间:2016-04-29 16:27:02

标签: android mysql runnable

我正在尝试实时检查数据库的记录。 为此,我打算每2分钟检查一次。 我一直在努力进行咨询。

查询使用排球,这可能是最方便的。问题是它似乎不适用于查询序列。

这是我的代码:

public void SQLQuery(final String hash) {
    Handler h = new Handler();
    h.postDelayed(new Runnable() {
        @Override
        public void run() {
            int time = 1;
            while (time <= 120) {
                if (!isAccepted) {
                    try {
                        makeRequestAgain(hash);
                        time++;
                        Log.d(TAG, String.valueOf(time));
                        pDialog.setMessage("Segundos restantes: " + time);
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                } else {
                    hidePDialog();
                    Toast.makeText(getActivity(), "Autorización denegada o tiempo de espera agotado.", Toast.LENGTH_LONG).show();
                    break;
                }
            }
        }
    }, 120000);
}

public void makeRequestAgain(final String hash) {
    StringRequest stringRequest = new StringRequest(Request.Method.POST, PrepareData.CHECK_REQUEST,
            new Response.Listener<String>() {
                @Override
                public void onResponse(final String response) {
                    if (response.equalsIgnoreCase(PrepareData.USER_ACCEPT)) {
                        //
                        //El user acepto -> OK -> Intent MAP
                        isAccepted = true;
                        Toast.makeText(getActivity(), "Autorización OK", Toast.LENGTH_LONG).show();
                    } else {
                        Toast.makeText(getActivity(), "Todavia no acepta...", Toast.LENGTH_LONG).show();
                    }
                }
            }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            Toast.makeText(getActivity(), "Se perdió la conexión con el servidor.", Toast.LENGTH_LONG).show();
        }
    }) {
        @Override
        protected Map<String, String> getParams() throws AuthFailureError {
            Map<String, String> params = new HashMap<>();
            params.put(PrepareData.ID_CONSULTA, hash);
            return params;
        }
    };
    RequestQueue requestQueue = Volley.newRequestQueue(getActivity());
    requestQueue.add(stringRequest);
}

enter image description here

直接,我没有收到消息日志,并且没有更新进度对话框。

我将失败的是什么?

感谢您的建议。

修改

manifest.xml中的权限是正常的

<uses-permission android:name="android.permission.INTERNET" />

我在其他.java中使用相同的“makeRequestAgain()”并运行正常,所有请求都很好,但是,这个特殊的请求不起作用,。

2 个答案:

答案 0 :(得分:2)

您需要在添加请求之前致电requestQueue.start()

另外,我建议使用单个RequestQueue实例,并在开始新请求之前等待请求完成。

另外,不确定这与SQL有什么关系。 Volley是一个HTTP库。

答案 1 :(得分:1)

我认为你可以选择ThreadHandlerAsyncTask在内部使用Thread。所以请使用Thread

Thread t = new Thread(new Runnable(){ ... });
t.start();

因此,如果你想创建一个新的线程即时重新运行,可能是一个循环,

new Thread(t).start(); 

因为线程一旦成为守护进程就无法再次启动。

在runnable中,如果要更新UI元素,则必须使用runOnUiThread(new Runnable(){...});。在Runnable中调用它,而Runnable又在Thread内。