2016-04-29 48 views
0

我試圖實時檢查數據庫的記錄。 爲此,我打算每2分鐘檢查一次。 我一直在試着做這個諮詢。Android - SQL查詢每1秒鐘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" /> 

OK我使用同樣的 「makeRequestAgain()」 在其他的.java和運行正常,所有的請求都不錯,但是,這個特殊要求,不起作用。

+1

請添加更多信息,例如AndroidManifest中的權限,請求的HTTP響應以及您正在執行的Android版本(看起來像'M') – Bonatti

+0

已添加。我正在使用Android 6.0.0(API 23)。 – Ferrrmolina

回答

1

我認爲你可以用Thread去。 HandlerAsyncTask內部使用Thread。所以請使用Thread

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

所以,如果你想創建線程的一個新的即時再次運行,可能是在一個循環中,

new Thread(t).start(); 

因爲線程一旦成爲一個守護進程無法再次啓動。

在可運行內部,如果要更新UI元素,則必須使用runOnUiThread(new Runnable(){...});。在Runnable中調用它,該Runnable又在Thread之內。

+0

好的,我會試試。謝謝 – Ferrrmolina

+0

@Ferrrmolina當然,如果你有麻煩,我知道 – Sibidharan

+0

工作,部分,但你的建議似乎工作:)。謝謝 – Ferrrmolina

2

您需要在添加請求前先致電requestQueue.start()

此外,我建議使用單個RequestQueue實例,並在開始新實例之前等待請求完成。

此外,不確定這與SQL有什麼關係。 Volley是一個HTTP庫。

+0

好吧,我嘗試添加requestQueue.start(),但沒有工作。如何等待請求在開始新的請求之前完成?請問您能解釋一下嗎?我在一個PHP文件中進行查詢,我抽出一個post請求,然後檢查迴應是否爲== – Ferrrmolina

+0

您可以在'StringRequest'回調中發出下一個請求。 – Nathanael