2016-05-21 2 views
0

У меня есть приложение для Android, связанное с моей базой данных с помощью volley/JSON. Я хочу постоянно проверять таблицу «запрос» пользователя в моей базе данных и когда у него есть значение, равное 1, я хочу предупреждающее сообщение. Я использовал while loop для его обработки, но приложение аварийно. Все идеи, как избежать использования в то время как? Вот мой Java-код я бегу в mainactivity в методе OnCreate:Android-приложение вылетает во время цикла

 while(request!=1) { 

     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"); 

        //Toast.makeText(MainActivity.this,"Request from " + requestorigin ,Toast.LENGTH_LONG).show(); 
        // Toast.makeText(MainActivity.this,"Request from " + request ,Toast.LENGTH_LONG).show(); 

        if(request==1) { 
         Toast.makeText(MainActivity.this,"Request from " + requestorigin ,Toast.LENGTH_LONG).show(); 

        } 
       } catch (
         JSONException e 
         ) 
       { 
        e.printStackTrace(); 
       } 
      } 
     }; 

     CheckRequest checkRequest = new CheckRequest(username,response1Listener); 
     RequestQueue queue1 = Volley.newRequestQueue(MainActivity.this); 
     queue1.add(checkRequest); 
    } 

А вот класс CheckRequest:

package com.example.sakis.multiplayerdemo; 

import com.android.volley.Response; 
import com.android.volley.toolbox.StringRequest; 

import java.util.HashMap; 
import java.util.Map; 

public class CheckRequest extends StringRequest { 
    private static final String REGISTER_REQUEST_URL = "http://xxxxx.com/CheckRequest.php"; 
private Map<String, String> params; 

public CheckRequest(String username, Response.Listener<String> listener) { 
    super(Method.POST, REGISTER_REQUEST_URL, listener, null); 
    params = new HashMap<>(); 
    params.put("username", username ); 
} 

@Override 
public Map<String, String> getParams() { 
    return params; 
} 
} 

LogCat показывает это:

29582-29582/com.example.sakis.multiplayerdemo D/dalvikvm: VFY: replacing 
opcode 0x6f at 0x120b 05-21 12:38:17.236 29582-  
29582/com.example.sakis.multiplayerdemo E/dalvikvm: Could not find class 
'android.os.PersistableBundle', referenced from method 
com.example.sakis.multiplayerdemo.MainActivity.access$super 05-21 
12:38:17.236 29582-29582/com.example.sakis.multiplayerdemo W/dalvikvm: VFY: 
unable to resolve check-cast 222 (Landroid/os/PersistableBundle;) in 
Lcom/example/sakis/multiplayerdemo/MainActivity; 
+2

пожалуйста пост журнала – Manifest

+0

29582-29582/com.example.sakis.multiplayerdemo D/dalvikvm VFY: замена опкод 0x6F на 0x120b 05-21 12: 38: 17,236 29582-29582/com.example.sakis.multiplayerdemo Е/dalvikvm: Не удалось найти класс 'android.os.PersistableBundle', на который ссылается метод com.example.sakis.multiplayerdemo.MainActivity.access $ super 05-21 12: 38: 17.236 29582-29582/com.example.sakis. multayerdemo W/dalvikvm: VFY: не удалось разрешить проверку 222 (Landroid/os/PersistableBundle;) в Lcom/example/sakis/multiplayerdemo/MainActivity; –

+0

Он отлично работает, если я заменю цикл while на if и проверю его только один раз. –

ответ

0

Проблема это цикл while вращается, ожидая, когда будет изменено request, что происходит только в прослушивателе ответа. Слушатель называется асинхронно, поэтому вы эффективно блокируете свой основной поток и неоднократно ставили в очередь один и тот же запрос.

+0

Как вы думаете, лучше запустить цикл while в файле CheckRequest.php и просто ждать ответа? –

+0

Нет, не запускайте цикл while, ожидая ответов. Рассматривайте их как асинхронные события. –

+0

И как я могу это сделать? –

Смежные вопросы