当我按下登录按钮时,应用程序冻结了一段时间,因为它检查了主线程上的互联网连接。 如何在后台线程或新线程中执行此操作,它们之间有什么区别(后台线程和另一个新线程(。
我的互联网检查功能:
public Boolean isOnline() {
Runtime runtime = Runtime.getRuntime();
try {
Process ipProcess = runtime.exec("/system/bin/ping -c 1 8.8.8.8");
int exitValue = ipProcess.waitFor();
return (exitValue == 0);
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
return false;
}
您基本上是在尝试执行PING
命令来检查您是否具有真正的互联网连接,而不仅仅是网络连接。在这种情况下,它使用网络,因此您最终会得到一个 NetworkOnMainThreadException
.
实现此目的的方法之一是创建一个回调方法,该方法从后台线程返回PING
的结果。
下面的伪代码重申了我的意思:
interface ResultCallback {
void onComplete(boolean result);
}
class checkInternet extend AsyncTask<., ., Boolean> {
ResultCallback callback;
public static checkInternet(ResultCallback callback) {
this.callback = callback;
}
void doInBackGround() {
return isOnline();
}
onPostExecute(Boolean result) {
callback.onComplete(result);
}
}
有一个功能
void performCheckOnInternet(ResultCallback callback) {
new checkInternet(callback).execute();
}
现在,您可以调用此异步任务,如下所示:
performCheckOnInternet(new ResultCallback {
void onComplete(boolean result) {
//do your stuff here
}
});
你真的需要检查数据是否真的在流动吗?如果没有,您可以使用这个(更简单的(分配:
public static boolean hasInternetConnection(Context context) {
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
return activeNetwork != null && activeNetwork.isConnectedOrConnecting();
}