如何在 if 语句中使用异步任务结果
How to use async task results in if statement
我想在我的 onClick 中启动方法之前检查与特定网站的 Internet 连接。在做了一些研究后,我发现这个link谁接受了答案告诉我如何做到这一点问题是虽然该方法产生错误android os networkonmainthreadexception,我做了更多研究并发现在异步任务中要求这样的操作是运行。我怎样才能做到这一点,并仍然在我的按钮 onClick 方法中使用结果。
这是我在 onCreate
中的当前代码。
@Override
public void onClick(View view) {
if (isInternetAvailable("18.184.67.80", 443, 1000)) {
Method() ;
} else {
Toast.makeText(getApplicationContext)) , "Internet not available" ).show;
}
}
下面是检查网站互联网连接的代码
public boolean isInternetAvailable(String address, int port, int timeoutMs) {
try {
Socket sock = new Socket();
SocketAddress sockaddr = new InetSocketAddress(address, port);
sock.connect(sockaddr, timeoutMs); // This will block no more than timeoutMs
sock.close();
return true;
} catch (IOException e) {
return false;
}
}
如何在异步任务中使用上述代码,并在 oncreate 方法的 if 语句中使用结果判断是否没有互联网连接?
早些时候我也发现了这个 How to check internet access on Android? InetAddress never times out 但我不明白我会使用什么代码从异步任务中导出结果并在 onClick 下的 oncreate 中使用它们。
您可以在 onClick()
中启动 AsyncTask
检查 Internet 可用性,并且在 AsyncTasks 的 onPostExecute()
中您可以根据结果更新 UI。
由于AsyncTask.execute()
只接受一个参数,你可以使用包装器class传入地址,端口 和 timeOutMs:
class InetAddress{
public InetAddress(String address, int port, int timeoutMs){
this.address = address;
this.port = port;
this.timeOutAfterMs = timeoutMs;
}
String address;
int port;
int timeOutAfterMs;
}
AsyncTask
代码:
class InternetCheckTask extends AsyncTask<InetAddress, Void, Boolean> {
@Override
protected Boolean doInBackground(InetAddress... inetAddresses) {
try {
InetAddress inetAddress = inetAddresses[0];
Socket sock = new Socket();
SocketAddress sockaddr = new InetSocketAddress(inetAddress.address, inetAddress.port);
sock.connect(sockaddr, inetAddress.timeOutAfterMs); // This will block no more than timeoutMs
sock.close();
return true;
} catch (IOException e) { return false; }
}
@Override
protected void onPostExecute(Boolean isInternetAvailable) {
// Note: this will be executed on the main thread
if(isInternetAvailable){
doSomething();
}
else{
Toast.makeText(MainActivity.this , "Internet not available", Toast.LENGTH_SHORT ).show();
}
}
}
在 onClick()
开始,像这样:
@Override
public void onClick(View view) {
InetAddress inetAddress = new InetAddress("18.184.67.80", 443, 1000);
new InternetCheckTask().execute(inetAddress);
}
我想在我的 onClick 中启动方法之前检查与特定网站的 Internet 连接。在做了一些研究后,我发现这个link谁接受了答案告诉我如何做到这一点
这是我在 onCreate
中的当前代码。
@Override
public void onClick(View view) {
if (isInternetAvailable("18.184.67.80", 443, 1000)) {
Method() ;
} else {
Toast.makeText(getApplicationContext)) , "Internet not available" ).show;
}
}
下面是检查网站互联网连接的代码
public boolean isInternetAvailable(String address, int port, int timeoutMs) {
try {
Socket sock = new Socket();
SocketAddress sockaddr = new InetSocketAddress(address, port);
sock.connect(sockaddr, timeoutMs); // This will block no more than timeoutMs
sock.close();
return true;
} catch (IOException e) {
return false;
}
}
如何在异步任务中使用上述代码,并在 oncreate 方法的 if 语句中使用结果判断是否没有互联网连接?
早些时候我也发现了这个 How to check internet access on Android? InetAddress never times out 但我不明白我会使用什么代码从异步任务中导出结果并在 onClick 下的 oncreate 中使用它们。
您可以在 onClick()
中启动 AsyncTask
检查 Internet 可用性,并且在 AsyncTasks 的 onPostExecute()
中您可以根据结果更新 UI。
由于AsyncTask.execute()
只接受一个参数,你可以使用包装器class传入地址,端口 和 timeOutMs:
class InetAddress{
public InetAddress(String address, int port, int timeoutMs){
this.address = address;
this.port = port;
this.timeOutAfterMs = timeoutMs;
}
String address;
int port;
int timeOutAfterMs;
}
AsyncTask
代码:
class InternetCheckTask extends AsyncTask<InetAddress, Void, Boolean> {
@Override
protected Boolean doInBackground(InetAddress... inetAddresses) {
try {
InetAddress inetAddress = inetAddresses[0];
Socket sock = new Socket();
SocketAddress sockaddr = new InetSocketAddress(inetAddress.address, inetAddress.port);
sock.connect(sockaddr, inetAddress.timeOutAfterMs); // This will block no more than timeoutMs
sock.close();
return true;
} catch (IOException e) { return false; }
}
@Override
protected void onPostExecute(Boolean isInternetAvailable) {
// Note: this will be executed on the main thread
if(isInternetAvailable){
doSomething();
}
else{
Toast.makeText(MainActivity.this , "Internet not available", Toast.LENGTH_SHORT ).show();
}
}
}
在 onClick()
开始,像这样:
@Override
public void onClick(View view) {
InetAddress inetAddress = new InetAddress("18.184.67.80", 443, 1000);
new InternetCheckTask().execute(inetAddress);
}