在java中循环的后台服务调用?

时间:2017-10-31 09:59:15

标签: java for-loop background-service

我希望我能以正确的方式解释这个问题:) 我有一个对象数组(handleData)。我从DB获取它们。我想通过分别为每个服务器调用服务将它们发送到服务器。 我将服务放在for循环中以发送所有handleData(参考代码)。

呼叫服务是在后台完成的。每个人的反应可能不会随着他们有条不紊地发送而来。我必须为我发送的每个handleData做一些更新。

问题:当响应到来时,我不确定是否对我想要/正确发送的确切handleData进行了所考虑的操作(记录更新)。

private void sendDataOfTemplates() {
    ArrayList<FormHandleData> formHandleDatas = FormHandleData.getDatasFromDB(getContext(), 12, EnumDataStatusOfServer.NoSTATUS.getIntValue(),-1);// true means >> to send / -1 means no limit
    try {
        if (formHandleDatas != null && formHandleDatas.size() != 0) {
            for (int i = 0; i < formHandleDatas.size(); i++) {
                final FormHandleData handleData = formHandleDatas.get(i);
                if (handleData.status_in_server == EnumDataStatusOfServer.OPEN.getIntValue())
                    if (handleData.status_in_app == EnumDataStatusInApp.SAVED.getIntValue() || handleData.status_in_app == EnumDataStatusInApp.EDITED.getIntValue()) {
                        ServiceHelper.getInstance().sendDataOfTemplates(new ServiceHelper.ResponseListener() {
                            @Override
                            public void onResponse(String response) {
                                try {

                                    SimpleResponse simple_response = new Gson().fromJson(response, SimpleResponse.class);
                                    if (simple_response.isSuccessful()) {
                                       handleData.status_in_app = EnumDataStatusInApp.SENT.getIntValue();
                                        FormHandleData.UpdateDataTemplatesInDB(handleData, getContext(),false);
                                    } else {
                                    }
                                } catch (Exception e) {
                                }
                            }

                            @Override
                            public void onErrorResponse(VolleyError error) {
                            }
                        }, handleData);
                    }
            }
        }
    } catch (Exception e) {
    }

}

3 个答案:

答案 0 :(得分:7)

  

问题:当响应到来时,我不确定是否对我想要/正确发送的确切handleData执行了所考虑的操作(记录更新)。

如果我的理解正确,那么您正在询问是否由匿名handleData子类访问的周围局部变量ServiceHelper.ResponseListener将始终是同一对象实例,即使在下一个{{1} } cycle该变量的值将不同。答案是肯定的。因此,您不必担心。

如果您想进一步了解匿名类如何从周围的范围捕获变量,请阅读this part of the Oracle's Java tutorial,其中说:

  
      
  • 匿名类可以访问其封闭类的成员。
  •   
  • 匿名类无法在其封闭范围内访问未声明为final或有效地为final的局部变量。
  •   

因此可以访问周围变量的事实意味着,从匿名类的角度来看,它是(有效)最终变量,即它不会改变。

这是一个使用多个线程的演示:

for
package de.scrum_master.app;

public class WhoDoesWhat {
  private String name;
  private final String action;

  public WhoDoesWhat(String name, String action) {
    this.name = name;
    this.action = action;
  }

  public String getName() {
    return name;
  }

  @Override
  public String toString() {
    return name + " -> " + action;
  }
}

控制台日志如下所示:

package de.scrum_master.app;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public class Application {
  private static final Random RANDOM = new Random();

  public static void main(String[] args) {
    List<WhoDoesWhat> peopleDoingSomething = new ArrayList<>();
    peopleDoingSomething.add(new WhoDoesWhat("Galileo", "discover moons of Jupiter"));
    peopleDoingSomething.add(new WhoDoesWhat("Johannes", "determine the laws of planetary motion"));
    peopleDoingSomething.add(new WhoDoesWhat("Albert", "explain the precession of Mercury"));
    peopleDoingSomething.add(new WhoDoesWhat("Edwin", "notice something odd about recession speeds of galaxies"));

    for (WhoDoesWhat personDoingSomething : peopleDoingSomething) {
      new Thread(() -> {
        System.out.println("START " + personDoingSomething);
        try {
          int waitCycles = 1 + RANDOM.nextInt(10);
          for (int cycle = 0; cycle < waitCycles; cycle++) {
            System.out.println("  " + personDoingSomething.getName() + " is still being busy");
            Thread.sleep(250);
          }
        } catch (InterruptedException e) {
        }
        System.out.println("STOP " + personDoingSomething);
      }).start();
    }
  }
}

答案 1 :(得分:3)

当每个人像递归方法一样完成时,你可以逐个发送它们。希望这对你有用..

答案 2 :(得分:0)

  

问题:当响应到来时,我不确定是否对我想要/正确发送的确切handleData执行了所考虑的操作(记录更新)。

我知道这是一个旧线程,但只想提供帮助........ 为了确定返回的handleData对应于formHandleDatas ArrayList的哪个元素,您可以将handleData与handleData一起发送给服务器(然后,将其发送回客户端),该ID(对于数组列表的每个元素都是唯一的)服务器返回结果。这样,就有可能找到确切的handleData。在这里,我对您的代码进行了一些重构。

    private void sendDataOfTemplates() {

    Map<Integer, FormHandleData> formHandleDataMap = FormHandleData.getDatasFromDBAsMap();

    try {

        if (formHandleDataMap != null && formHandleDataMap.size() != 0) {

            formHandleDataMap.forEach((key, handleData) -> {

                if (handleData.getStatusInServer() == FormHandleData.EnumDataStatusOfServer.OPEN.ordinal())
                    if (handleData.getStatusInApp() == FormHandleData.EnumDataStatusInApp.SAVED.ordinal() ||
                            handleData.getStatusInApp()== FormHandleData.EnumDataStatusInApp.EDITED.ordinal()) {

                        ServiceHelper.getInstance().sendDataOfTemplates(
                                new ServiceHelper.ResponseListener() {
                                    @Override
                                    public void onResponse(String response) {
                                        try {

                                            SimpleResponse simpleResponse = new Gson().fromJson(response, SimpleResponse.class);
                                            FormHandleData currentHandleData = formHandleDataMap.get(simpleResponse.getKey());
                                            if (simpleResponse.isSuccessful()) {
                                                currentHandleData.setStatusInApp(FormHandleData.EnumDataStatusInApp.SENT.ordinal());
                                                FormHandleData.UpdateDataTemplatesInDB(currentHandleData, getContext(), false);
                                            } else {
                                                System.out.println("simple response is not successful");
                                            }
                                        } catch (Exception e) {
                                            System.out.println("exception happened while getting simple response:" + e.getMessage());
                                            e.printStackTrace();
                                        }
                                    }

                                    @Override
                                    public void onErrorResponse() {
                                    }

                                }, handleData);

                    }


            });

        }
    } catch (Exception e) {
        System.out.println("exception happened:" + e.getMessage());
        e.printStackTrace();
    }


}

在这里,我使用Map处理我提到的唯一ID,实际上,唯一ID是Map中handleData条目的键。希望对您有帮助。