繁体   English   中英

如何停止在 Java 中重复自己

[英]How to stop repeating myself in Java

我通过使用回调方法在 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 中使用?

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

是的,在 Java 中很容易。 以上面的示例为例,您可以像这样用 Java 编写它:

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

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

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

异步任务

文档

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 ,顾名思义,将在后台线程中执行某段代码。 请注意,每个AsyncTask都将在大小为 1 的ThreadPool上运行,因此它们实际上会妨碍其他AsyncTasks

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

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

线程和处理程序

文档中建议的另一个选项是使用线程和处理程序在主线程和后台线程之间进行通信。 虽然这提供了更大的灵活性,但它也需要更多的责任,因为您将负责自己管理通信、选择合适的时间终止线程以及在出现问题时如何恢复。

根据经验,只有在您确实需要额外的灵活性时才应该这样做。

总体思路是创建自己的 Handler 并覆盖其handleMessage方法。

  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 但是,我鼓励您先从基础开始,然后再深入研究更复杂的东西。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM