在没有 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;
/* ... */
}
});
OR 在 AsyncTask
(=InternetCheck
class) 本身(在 onPostExecute
! 内)检查它显然只有在同一个 file/class, ...
中才有可能
简而言之,有很多方法可以解决这个问题,包括自定义(抽象)Actvity
-class,您的所有活动都继承自它;做类似事情的自定义 App
-class(如果做错了就值得怀疑!!);或使用 ContentProvider
(很好的做法,但需要大量工作)。
有人可以告诉我这个答案 没有 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;
/* ... */
}
});
OR 在 AsyncTask
(=InternetCheck
class) 本身(在 onPostExecute
! 内)检查它显然只有在同一个 file/class, ...
简而言之,有很多方法可以解决这个问题,包括自定义(抽象)Actvity
-class,您的所有活动都继承自它;做类似事情的自定义 App
-class(如果做错了就值得怀疑!!);或使用 ContentProvider
(很好的做法,但需要大量工作)。