【问题标题】:Android Application crashes in while loopAndroid应用程序在while循环中崩溃
【发布时间】:2016-05-21 09:55:09
【问题描述】:

我有一个使用 volley/JSON 与我的数据库连接的 android 应用程序。我想连续检查数据库中用户的表“请求”,当它的值等于 1 时,我想要一条警报消息。我使用while 循环来处理它,但应用程序崩溃。任何想法如何避免使用 while? 这是我在 onCreate 方法中遇到 mainactivity 的 java 代码:

     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; 

【问题讨论】:

  • 29582-29582/com.example.sakis.multiplayerdemo D/dalvikvm: VFY: 在 0x120b 05-21 12:38:17.236 处替换操作码 0x6f 29582-29582/com.example.sakis.multiplayerdemo E /dalvikvm:找不到类 'android.os.PersistableBundle',引用自方法 com.example.sakis.multiplayerdemo.MainActivity.access$super 05-21 12:38:17.236 29582-29582/com.example.sakis.multiplayerdemo W/dalvikvm: VFY: 无法解析 Lcom/example/sakis/multiplayerdemo/MainActivity 中的 check-cast 222 (Landroid/os/PersistableBundle;);
  • 如果我用 if 替换 while 循环并只检查一次,它会完美运行
  • 最好编辑你的帖子并在那里添加日志,它更具可读性
  • 但是具体的例外是什么?

标签: java android json while-loop android-volley


【解决方案1】:

问题是 while 循环正在旋转等待 request 更改,这仅发生在响应侦听器中。侦听器是异步调用的,因此您实际上是在阻塞主线程并重复对同一请求进行排队。

【讨论】:

  • 您认为在 CheckRequest.php 文件中运行 while 循环并等待响应更好吗?
  • 不,不要运行一个while循环来等待响应。将它们作为异步事件处理。
  • 我该怎么做?
猜你喜欢
  • 2013-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-23
  • 2012-06-19
  • 2021-07-09
  • 1970-01-01
相关资源
最近更新 更多