有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Android改造循环请求不执行回调

我对安卓 studio和改装库以及它处理数据的方式有意见

我有一个简单的操作流程,我想:

  • 从服务器上的数据库请求单个项目(获取请求)
  • 等待回调以确认应用程序已收到该回调
  • 添加另一个请求(循环)
  • 发送所有数据时停止添加请求

我遇到的问题是,在发送所有请求之前,获取结果的onResponse回调不会运行。那么所有的回答都是错误的。(如果我调用单个项目(数据库中的1个项目)),则回调运行正常

如何强制它发送一个请求,并在发送另一个请求之前等待该响应

循环代码

private void Pull_data_loop(int total_entries){
        //int current_data_point = 0;
        boolean datum_processing = false;

        for (int i = 1; i <= total_entries; i++) {

            Add_single_datam(i);//Call until all entries are fetched from the server
        }
    }

获取代码-未运行回调需要等待此回调,然后再发送下一个请求

private void Add_single_datam(int id)
    {
        HashMap<String, String> map = new HashMap<>();
        map.put("Id_request", Integer.toString(id));//The ID value
        Call<Fetch_result> call = retrofitInterface.executeGet_data(map);//Run the post
        call.enqueue(new Callback<Fetch_result>() {
            @Override
            public void onResponse(Call<Fetch_result> call, Response<Fetch_result> response) {
                if (response.code() == 200)//Successful login
                {
                    D1= response.body().getD1_String();
                    D2= response.body().getD2_String();
                   

                    boolean result = BLE_DB.addData_Downloaded(D1, D2);//Add data
                    if (result == true) {
                        Log.d(TAG, "data_changes: Added data correctly");
                    }
                    if (result == false) {
                        Log.d(TAG, "data_changes: did not add data correctly");
                    }//false

                } else if (response.code() == 404) {
                    Utils.toast(getApplicationContext(), "Get data fail");//Pass information to the display
                }
            }

            @Override
            public void onFailure(Call<Fetch_result> call, Throwable t) {
                Utils.toast(getApplicationContext(), "Get data error");
            }
        });
    }

注:

我正在使用NodeJS服务器处理我的请求。我发送Id,它在数据库中返回该Id


共 (2) 个答案

  1. # 1 楼答案

    您可以向Add_single_datam发送一个回调实例,然后在改装响应中,向该回调成功发送。 然后在该回调中,您将使用iteravel i,您可以查看是否到达了total_entries的末尾,在i中添加+1并再次发出请求,或者只是停止

  2. # 2 楼答案

    使用一些线程解决方案,如RxJava、协同程序或AsyncTask。它不遵循规则的原因是因为有两个线程正在分发工作,所以为了让它同步工作,我们必须使用上面提到的一些线程解决方案,并在后台线程上执行这个for循环,使它像一个同步调用一样,获得所有结果,最后使用结果切换回主线程

    如果您熟悉AsynTask

     private class FetchDataTask extends AsyncTask<Int, Integer, List<Fetch_result>> {
     protected Long doInBackground(Int... total_entries) {
     List<Fetch_result> allResults = new ArrayList<Fetch_result>();
         for (int i = 1; i <= total_entries[0]; i++) {
           HashMap<String, String> map = new HashMap<>();
           map.put("Id_request", Integer.toString(total_entries[0]));
           Fetch_result response = retrofitInterface.executeGet_data(map).execute().body(); 
           allResults.add(response);
        } 
         return allResults;
     }
    
     protected void onProgressUpdate(Integer... progress) {
         //show progress 
     }
    
     protected void onPostExecute(List<Fetch_result> result) {
         //do something on main thread, in loop on result
          D1= result[0].getD1_String();
          D2= result[0].getD2_String();
          boolean result = BLE_DB.addData_Downloaded(D1, D2);//Add data
          if (result == true) {
              Log.d(TAG, "data_changes: Added data correctly");
           }
           if (result == false) {
               Log.d(TAG, "data_changes: did not add data correctly");
           }//false
     }
    }
    

    现在就这样打电话

    new FetchDataTask().execute(total_entries);