首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么后一种代码要在前一种代码之前执行呢?

为什么后一种代码要在前一种代码之前执行呢?
EN

Stack Overflow用户
提问于 2019-05-12 12:00:31
回答 1查看 84关注 0票数 3

我想在不知道工厂确切数量的情况下从本地服务器获取工厂数据。以下是一些代码:

代码语言:javascript
复制
public class StartActivity extends AppCompatActivity implements View.OnClickListener{
    boolean isSuccess = false;
    RequestQueue queue =NoHttp.newRequestQueue();
    ArrayList<String> fac_name = new ArrayList<>();
    ArrayList<String> lat = new ArrayList<>();
    ArrayList<String> lng = new ArrayList<>();

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //...
        NoHttp.initialize(this);
        //...
        do {
            int id = 1;
            getFactories(id);
            id++;
            Log.d("wellS", String.valueOf(isSuccess));

        }while(isSuccess);
    }

    public void getFactories(final int id){
        isSuccess = false;
        String url ="http://192.168.0.108:5000/factories/"+id;
        Request<JSONObject> request = NoHttp.createJsonObjectRequest(url);

        queue.add(0, request, new OnResponseListener<JSONObject>() {
            @Override
            public void onStart(int what) {
                Log.d("wellS", "Started to get data from server");
            }

            @Override
            public void onSucceed(int what, Response<JSONObject> response) {
                if(response.responseCode() == 200){
                    Log.d("wellS", "Successfully connected to server");
                    JSONObject j1 = response.get();
                    Iterator<String> it = j1.keys();

                    String key = it.next();
                    String value = null;
                    try {
                        value = j1.getString(key);
                        JSONObject j2 = new JSONObject(value);
                        Iterator<String> it2 = j2.keys();
                        int count = 1;
                        while(it2.hasNext()) { 
                            String key2 = it2.next();
                            String value2 = j2.getString(key2);

                            switch (count) {
                                case 1:
                                    fac_name.add(value2);
                                    break;
                                case 3:
                                    lat.add(value2);
                                    break;
                                case 4:
                                    lng.add(value2);
                                    break;
                                default:
                                    break;

                            }
                            count++;
                        }
                        Log.d("wellS", "工厂名称:" + fac_name.get(id-1)+" 纬度:"+lat.get(id-1)+" 经度:"+lng.get(id-1));
                        isSuccess = true;
                        Log.d("wellS", String.valueOf(isSuccess)+ " ABC");


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


                }
            }

            @Override
            public void onFailed(int what, Response<JSONObject> response) {

                Exception exception = response.getException();
                if(exception instanceof NetworkError) {
                    Log.d("wellS", "Error");
                }
            }

            @Override
            public void onFinish(int what) {
                Log.d("wellS", "Connection finished");

            }
        });
    }

onSucceed of getFactories方法中,有一行Log.d("wellS", String.valueOf(isSuccess)+ " ABC");,在do-while中执行该方法之后,就会有Log.d("wellS", String.valueOf(isSuccess))。但逻辑猫显示:

2019-05-12 19:42:17.597 18535-18535/?D/wellS:假

2019年-05-12 19:42:17.646 18535-18535/?D/wellS:开始从服务器获取数据

2019年-05-12 19:42:17.845 18535-18535/?D/wellS:成功连接到服务器

2019年-05-12 19:42:17.846 18535-18535/?D/威尔斯:工厂名称:南京纬度:32.013521经度:118.776431

2019-05-12 19:42:17.846 18535-18535/?D/wellS:真正的ABC

2019年-05-12 19:42:17.846 18535-18535/?D/井:连接完成

第二行似乎是在第一行之前执行的,而do-while只执行了一次。为什么会这样呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-12 12:14:03

好吧,因为队列将在一个新的生成线程中异步地处理请求。这意味着它没有阻塞主线程(包含2019-05-12 19:42:17.597 18535-18535/? D/wellS: false)的运行。

服务器请求会阻塞操作,因为它会阻塞正在运行的线程,直到收到响应。在单独线程中执行操作有助于避免阻塞父线程。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56099031

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档