簡體   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