如何停止在Java中重复自己

时间:2017-09-27 13:27:11

标签: java android

我在JavaScript中使用一种方法多次使用回调方法,因为JavaScript是一种异步语言。

示例:

function missionOne () {
    sumCalculation(1, 2, function (result) {
        console.log(result) // writes 3
    })
}

function sumCalculation (param1, param2, callback) { 
  let result = param1 + param2
  // The things that take long time can be done here
  callback(result)
}

我想知道是否有办法让自己停止使用Java?

编辑:我删除了几个使问题更复杂的句子。

2 个答案:

答案 0 :(得分:0)

是的,Java很容易。举个例子,你可以用Java编写它:

public static void main(String[] args) {
  System.out.println(sumCalc(1,2));
}

private int sumCalc(int first, int second) {
  return first + second;
}

答案 1 :(得分:0)

我可能会在您的问题中阅读太多内容,但您似乎正在研究如何在Android中处理异步代码。有几个本机选项(不考虑任何库)。我会关注两个,但请记住还有其他选择。

AsyncTasks

来自documentation

  

AsyncTask可以正确,轻松地使用UI线程。此类允许您执行后台操作并在UI线程上发布结果,而无需操作线程和/或处理程序。

在编写之前,您需要知道它将接收哪种类型的参数,它将在计算期间发布的进度类型以及它的返回类型。这些类型通过AsyncTask通用参数AsyncTask<Params,Progress,Result>定义。如果您不需要任何这些内容,请将其设置为Void

以下是使用AsyncTask计算两个ints总和的基本要点:

public void sumCalculation (int param1, int param2, Callback callback) { 
    new AsyncTask<Integer, Void, Integer>() {

        @Override
        public Integer doInBackground(Integer... params) {
            int result = 0;
            for (Integer param : params) {
                result += param;
            }
            return result;                
        }

        @Override
        protected void onPostExecute(Integer integer) {
            super.onPostExecute(integer);
            callback.onDone(integer);
        }

    }.execute(param1, param2);
}
正如名称所示,

doInBackground将在后台线程中执行某段代码。请注意,每AsyncTaskThreadPool的大小均为AsyncTasks,因此它们实际上会妨碍其他onPostExecute

AsyncTask将结果返回给主线程,因此您可以更新任何UI组件。如果您尝试从后台线程更新UI,则会抛出异常。

这个特定示例的缺点是每次调用该函数时都会创建一个新的AsyncTask。 此外,只有当任务运行了很长时间,最多几秒钟时,才应使用handleMessage

线程和处理程序

documentation上建议的另一个选项是使用线程和处理程序在主线程和后台线程之间进行通信。虽然这提供了更大的灵活性,但它还需要更多的责任,因为您将负责自己管理通信,选择正确的时间来杀死线程以及如何在出现问题时恢复。

根据经验,如果你真的需要额外的灵活性,你应该这样做。

总体思路是创建自己的Handler并覆盖其 public class MyHandler { @Override public void handleMessage(Message inputMessage) { int messageType = inputMessage.what; Object extraData = inputMessage.obj; ... } } public class MyTask extends Thread { public static public int COMPUTATION_DONE = 0; private MyHandler handler; public MyTask(MyHandler handler) { this.handler = handler; } @Override public void run() { //do your computation Message message = handler.obtainMessage(COMPUTATION_DONE, your_result); handler.sendMessage(message); } } 方法。

inputMessage.what

正如您所看到的,这需要解析inputMessage.obj并决定如何处理它。此外,您需要将Services转换为正确的类型,依此类推。

这只是两个例子,但根据您尝试做的事情,您可能需要深入研究RxJava2或查看一些被动方法,例如 SELECT DATE_FORMAT(created_on,'%Y-%m-%d %h:%i:00') minute , COUNT(*) total FROM api_request GROUP BY minute; 。但是我鼓励你从基础开始,然后再深入了解更复杂的事情。