在没有 lambda 表达式的情况下检查 Android 上的互联网访问 (Levit)

Check internet access on Android without lambda expression (Levit)

有人可以告诉我这个答案 没有 lambda 表达式的等价物吗?

Extra: One-shot AsyncTask Example

class InternetCheck extends AsyncTask<Void,Void,Boolean> {

    private Consumer mConsumer;
    public  interface Consumer { void accept(Boolean internet); }

    public  InternetCheck(Consumer consumer) { mConsumer = consumer; execute(); }

    @Override protected Boolean doInBackground(Void... voids) { try {
        Socket sock = new Socket();
        sock.connect(new InetSocketAddress("8.8.8.8", 53), 1500);
        sock.close();
        return true;
    } catch (IOException e) { return false; } }

    @Override protected void onPostExecute(Boolean internet) { mConsumer.accept(internet); }
}

///////////////////////////////////////////////////////////////////////////////////
// Usage

    new InternetCheck(internet -> { /* do something with boolean response */ });

没有 lambda 表达式应该是这样的:

new InternetCheck(new InternetCheck.Consumer() {
    @Override
    public void accept(Boolean internet) {
        if (internet) {
            Log.d("TAG", "Internet is connected");
            doSomethingOnConnected();
        } else {
            Log.d("TAG", "Internet is not connected");
            doSomethingOnNoInternet();
        }     
    }
}).execute();
///////////////////////////////////////////////////////////////////////////////////
// Usage

    new InternetCheck(new InternetCheck.Consumer() {
        @Override
        public void accept(Boolean internet) { /* do something with boolean response */ } 
    });

...例如将是等效的非 lambda 表示(正如@NongthonbamTonthoi 也提到的)。

此代码部分的补充说明(作为作者)

activity 上下文中使用它时 你可能想检查你的 App/Activity 是否处于“onPause/onStop”状态,因为 answer/call 将是异步的,您 可能 依赖于它。

我在最初的回答中没有提到这个,因为它太过详细了,但是在 onResume[=45= 中将布尔值设置为 true ],在 onPause 中将它设置为 false,并在我们的 onPostExecute 中检查它(例如)将是大多数情况下的良好做法。

(编辑)更多细节/示例:

boolean mStopped;

@Override
protected void onStart() {
    super.onStart();
    mStopped = false;
}

@Override
protected void onStop() {
    mStopped = true;
    super.onStop();
}

并且以最简单的“为了安全起见”的方式,在你的accept-方法中检查它:

    new InternetCheck(new InternetCheck.Consumer() {
        @Override public void accept(Boolean internet) { 
            if (mStopped) return; 

            /* ... */ 
        } 
    });

ORAsyncTask (=InternetCheck class) 本身(在 onPostExecute! 内)检查它显然只有在同一个 file/class, ...

中才有可能

简而言之,有很多方法可以解决这个问题,包括自定义(抽象)Actvity-class,您的所有活动都继承自它;做类似事情的自定义 App-class(如果做错了就值得怀疑!!);或使用 ContentProvider(很好的做法,但需要大量工作)。