Android - SQL 每 1 秒查询一次,持续 2 分钟
Android - SQL query every 1 second for 2 minutes
我正在尝试实时检查数据库的记录。
为此,我打算每 2 分钟每 1 秒检查一次。
我一直在努力做咨询。
查询用的是volley,也许是最方便的。问题是查询序列似乎不起作用。
这是我的代码:
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);
}
直接,我没有得到消息日志,也没有更新进度对话框。
我会失败什么?
谢谢指教。
编辑:
权限在 manifest.xml
<uses-permission android:name="android.permission.INTERNET" />
我在其他 .java 和 运行 中使用相同的 "makeRequestAgain()" 很好,所有请求都很好,但是,这个特殊的请求,不起作用,.
您需要在添加请求之前调用 requestQueue.start()
。
此外,我建议使用单个 RequestQueue
实例,并在开始新请求之前等待请求完成。
此外,不确定这与 SQL 有什么关系。 Volley 是一个 HTTP 库。
我想你可以选择 Thread
。 Handler
或 AsyncTask
在内部使用 Thread
。所以选择 Thread
.
Thread t = new Thread(new Runnable(){ ... });
t.start();
所以如果你想再次创建一个新的线程到运行,可能会在一个循环中,
new Thread(t).start();
因为线程一旦成为守护进程就无法再次启动。
在 运行nable 中,如果你想更新一个 UI 元素,你必须使用 runOnUiThread(new Runnable(){...});
来完成。在 Runnable 中调用它,而 Runnable 又在 Thread
.
中
我正在尝试实时检查数据库的记录。 为此,我打算每 2 分钟每 1 秒检查一次。 我一直在努力做咨询。
查询用的是volley,也许是最方便的。问题是查询序列似乎不起作用。
这是我的代码:
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);
}
直接,我没有得到消息日志,也没有更新进度对话框。
我会失败什么?
谢谢指教。
编辑:
权限在 manifest.xml
<uses-permission android:name="android.permission.INTERNET" />
我在其他 .java 和 运行 中使用相同的 "makeRequestAgain()" 很好,所有请求都很好,但是,这个特殊的请求,不起作用,.
您需要在添加请求之前调用 requestQueue.start()
。
此外,我建议使用单个 RequestQueue
实例,并在开始新请求之前等待请求完成。
此外,不确定这与 SQL 有什么关系。 Volley 是一个 HTTP 库。
我想你可以选择 Thread
。 Handler
或 AsyncTask
在内部使用 Thread
。所以选择 Thread
.
Thread t = new Thread(new Runnable(){ ... });
t.start();
所以如果你想再次创建一个新的线程到运行,可能会在一个循环中,
new Thread(t).start();
因为线程一旦成为守护进程就无法再次启动。
在 运行nable 中,如果你想更新一个 UI 元素,你必须使用 runOnUiThread(new Runnable(){...});
来完成。在 Runnable 中调用它,而 Runnable 又在 Thread
.