«Стандартные простые» интерфейсы в Java?

Итак, здесь, на Java, я написал типичный класс для отправки json на сервер отдыха. (Я включу весь класс ниже для ясности.) Так что это файл"Fetcher.java"

Теперь для обратного вызова вам нужен интерфейс. Интерфейс тривиален, всего одна функция со строкой.

public interface FetcherInterface {
    public void fetcherDone(String result);
}

Раздражительно, вам нужен целый файл для этого,"FetcherInterface.java"

Так что этот интерфейс - не что иное, как «один обратный вызов со строкой». Часто все, что вам нужно, это просто «один обратный вызов без аргументов».

По факту ........Есть ли какие-то стандартные интерфейсы, которые я могу использовать, или что-то типа того?

Кажется, это немного раздражает, когда приходится вставлять целый интерфейс для такого простого «стандартного» интерфейса.

В чем дело? Что такое решение Javaly?

Кажется тыНЕ МОЖЕТ положить его в тот же файл:

Возможно, я что-то не так понял. Если бы вы могли поместить его в тот же файл, это было бы удобно по крайней мере.

(Лямбды пока практически не доступны. Во всяком случае, иногда вам нужен интерфейс.)

Просто для ясности, вот как вы называете класс

    JSONObject j = new JSONObject();
    try {
        j.put("height", 2.1);
        j.put("width", 2.5);
        j.put("command", "blah");
    } catch (JSONException e) {
        e.printStackTrace();
    }
    new Fetcher("mobile/login", j, new FetcherInterface() {
                @Override
                public void fetcherDone(String result) {
                    Log.d("DEV","all done");
                    doSomething(result);
                }
        }
    ).execute();

или действительно

public class HappyClass extends Activity implements FetcherInterface {
...

private void someCall() {
    JSONObject j = new JSONObject();
    try {
        j.put("height", 2.1);
        j.put("width", 2.5);
        j.put("command", "blah");
    } catch (JSONException e) {
        e.printStackTrace();
    }
    new Fetcher("mobile/data", j, this).execute();
    devBlank();
}

@Override
public void fetcherDone(String result) {
    Log.d("DEV","all done" +result);
    doSomething(result);
}

Вот весь класс ... Файл Fetcher.java

public class Fetcher extends AsyncTask<Void, Void, String> {

    private String urlTail;
    private JSONObject jsonToSend;
    private FetcherInterface callback;

    // initializer...
    Fetcher(String ut, JSONObject toSend, FetcherInterface cb) {
        urlTail = ut;
        jsonToSend = toSend;
        callback = cb;
    }

    @Override
    protected String doInBackground(Void... params) {

        HttpURLConnection urlConnection = null; // declare outside try, to close in finally
        BufferedReader reader = null;           // declare outside try, to close in finally
        String rawJsonResultString = null;
        String json = jsonToSend.toString();

        Log.d("DEV","the json string in Fetcher is " +json);

        try {
            URL url = new URL("https://falcon.totalfsm.com/" + urlTail);

            Log.d("DEV","the full URL in Fetcher is " +url);

            // open a json-in-the-body type of connection.......
            urlConnection = (HttpURLConnection) url.openConnection();
            urlConnection.setRequestMethod("POST");
            urlConnection.setRequestProperty("Content-Type", "application/json; charset=UTF-8");
            urlConnection.setDoOutput(true);
            urlConnection.setDoInput(true);
            urlConnection.setConnectTimeout(5000);
            // urlConnection.setDoOutput(false); // can be important?

            urlConnection.connect();

            OutputStream os = urlConnection.getOutputStream();
            os.write(json.getBytes("UTF-8"));
            os.close();

            // annoyingly, you have to choose normal versus error stream...
            InputStream inputStream;
            int status = urlConnection.getResponseCode();
            if (status != HttpURLConnection.HTTP_OK)
                inputStream = urlConnection.getErrorStream();
            else
                inputStream = urlConnection.getInputStream();
            if (inputStream == null) { // nothing to do.
                return null;
            }

            StringBuffer buffer = new StringBuffer();
            reader = new BufferedReader(new InputStreamReader(inputStream));
            String line;
            while ((line = reader.readLine()) != null) { // adding newlines makes debugging easier
                buffer.append(line + "\n");
            }

            if (buffer.length() == 0) { // stream was empty
                return null;
            }

            rawJsonResultString = buffer.toString();
            return rawJsonResultString;

        } catch (IOException e) {
            Log.e("PlaceholderFragment", "Error ", e);
            return null;
        } finally{
            if (urlConnection != null) {
                urlConnection.disconnect();
            }
            if (reader != null) {
                try {
                    reader.close();
                } catch (final IOException e) {
                    Log.e("PlaceholderFragment", "Error closing stream", e);
                }
            }
        }
    }

    @Override
    protected void onPostExecute(String s) {
        super.onPostExecute(s);
        Log.d("DEV", "Fetcher done");
        if (s==null) {
            Log.d("DEV","applying anti-null measures in Fetcher!");
            s = "message from app communications layer: 'null' returned from servers for that call at " +urlTail;
        }
        callback.fetcherDone(s);
    }
}

Ответы на вопрос(1)

Ваш ответ на вопрос