有谁能告诉我,没有lambda表达式的https://stackoverflow.com/a/27312494/9507009,这个答案相当于什么?
额外:一次AsyncTask示例 类InternetCheck扩展了AsyncTask {私有消费者mConsumer;公共接口消费者{虚空接受(布尔互联网);}公共InternetCheck(消费者消费者){mConsumer=使用者;execute();}@覆盖受保护的布尔doInBackground(MConsumer)。Sock.connect(新InetSocketAddress("8.8.8.8",53),1500);sock.close();返回真;} catch (IOException e) {返回false;}}@覆盖受保护的无效onPostExecute(布尔互联网){ mConsumer.accept( internet);} /////////////////////////////////////////////////////////////////////////////////// Usage新InternetCheck(internet -> { /*使用布尔响应*/ });
发布于 2018-03-17 11:00:00
如果没有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();发布于 2018-12-12 11:31:30
///////////////////////////////////////////////////////////////////////////////////
// Usage
new InternetCheck(new InternetCheck.Consumer() {
@Override
public void accept(Boolean internet) { /* do something with boolean response */ }
});..。例如,将是等效的非lambda表示(如@NongthonbamTonthoi也提到)。
添加到本代码-章节(作为作者)
在活动上下文中使用它时,您可能需要检查App/Activity是否处于"onPause/onStop"-state中,因为应答/调用将是异步的,您可能依赖于它。
我在最初的答案中没有提到这一点,因为它涉及太多的细节,而是将布尔值设置为true in onResume,将其设置为false in onPause,并检查它(例如)。在我们的onPostExecute中,大多数情况下都是很好的实践。
(编辑)更多细节/示例:
boolean mStopped;
@Override
protected void onStart() {
super.onStart();
mStopped = false;
}
@Override
protected void onStop() {
mStopped = true;
super.onStop();
}以最简单的“只是为了安全”的方式,在您的accept-Method中检查它:
new InternetCheck(new InternetCheck.Consumer() {
@Override public void accept(Boolean internet) {
if (mStopped) return;
/* ... */
}
});或在AsyncTask (=InternetCheck类)本身(在onPostExecute!)中检查它,这显然只有当它驻留在同一个文件/类中时,才有可能.
简而言之,解决这个问题的方法有很多,包括一个定制的(抽象的) Actvity-class,您的所有活动都继承了它;一个做类似事情的自定义App-class (如果做错了就可疑了!!);或者使用ContentProvider (良好实践,但是很多工作)。
https://stackoverflow.com/questions/49335055
复制相似问题