[英]android.os.NetworkOnMainThreadException issue in Android
我正在检查飞溅活动中的互联网,并且如果有可用的互联网,我正在使用以下方法检查服务器是否在线
private void serverCall() {
database = DAO.getInstance(getApplicationContext()); //added by eagleeyes
pref = new Setting_preference(this);
if (!mIsBackButtonPressed) {
pref.editor.putBoolean("sound", true);
pref.editor.putBoolean("vibrate", true);
if (NetworkCheck.isInternetAvailable(SplashsActivity.this)) {
if (NetworkCheck.IsReachable(SplashsActivity.this)){
new DownloadLatestData().execute();
}
else {
if (database.isDataBaseCreated()) {
Intent i = new Intent(SplashsActivity.this, MainActivity.class);
startActivity(i);
overridePendingTransition(R.anim.fade_in, R.anim.fade_out);
finish();
} else {
connectionerror();
}
}
} else {
if (database.isDataBaseCreated()) {
Intent i = new Intent(SplashsActivity.this, MainActivity.class);
startActivity(i);
overridePendingTransition(R.anim.fade_in, R.anim.fade_out);
finish();
} else {
connectionerror();
}
}
}
}
我收到错误消息
java.lang.RuntimeException:android.os.NetworkOnMainThreadException
由于服务器原因,请检查主线程。 我考虑过很多选择,但是我还没有解决它的完美主意。 我的服务器检查代码如下
public static boolean IsReachable(Context context) {
final ConnectivityManager connMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
final NetworkInfo netInfo = connMgr.getActiveNetworkInfo();
boolean isReachable = false;
if (netInfo != null && netInfo.isConnected()) {
// Some sort of connection is open, check if server is reachable
try {
URL url = new URL(DataManager.SIMPLE_BASE_URL);
HttpURLConnection urlc = (HttpURLConnection) url.openConnection();
urlc.setRequestProperty("User-Agent", "Android Application");
urlc.setRequestProperty("Connection", "close");
urlc.setConnectTimeout(10 * 2000);
urlc.connect();
isReachable = (urlc.getResponseCode() == 200);
} catch (IOException e) {
//Log.e(TAG, e.getMessage());
}
}
return isReachable;
}
我应该怎么做才能解决这个问题?
如果我在下面的代码中使用StrictMode策略,那么它可以正常工作...但是我感到困惑,我可以不使用它。
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
让我知道有人可以帮助我解决这个问题。 谢谢
您无需检查URL是否可访问,只需调用new DownloadLatestData().execute();
如果网络可用。
并将条件放入失败或成功的异步任务中。
您应该在单独的后台线程中进行所有网络调用。 Android严格禁止在主线程上进行任何网络调用。 尝试使用类似AsyncTask的类在单独的线程内实现IsReachable(Context context)
方法。
编辑您可以尝试这样
public class Connection extends AsyncTask<Void, Void, Boolean> {
private ConnectivityManager mConnectivityManager;
private OnConnectionEstablishedListener mListener;
public interface OnConnectionEstablishedListener {
void onConnectionEstablished(boolean isReachable);
}
public Connection(ConnectivityManager connectivityManager, OnConnectionEstablishedListener listener) {
mConnectivityManager = connectivityManager;
mListener = listener;
}
@Override
protected Boolean doInBackground(Void... voids) {
final NetworkInfo netInfo = mConnectivityManager.getActiveNetworkInfo();
boolean isReachable = false;
if (netInfo != null && netInfo.isConnected()) {
// Some sort of connection is open, check if server is reachable
try {
URL url = new URL(DataManager.SIMPLE_BASE_URL);
HttpURLConnection urlc = (HttpURLConnection) url.openConnection();
urlc.setRequestProperty("User-Agent", "Android Application");
urlc.setRequestProperty("Connection", "close");
urlc.setConnectTimeout(10 * 2000);
urlc.connect();
isReachable = (urlc.getResponseCode() == 200);
} catch (IOException e) {
//Log.e(TAG, e.getMessage());
}
}
return isReachable;
}
@Override
protected void onPostExecute(Boolean isReachable) {
super.onPostExecute(isReachable);
mListener.onConnectionEstablished(isReachable);
}
}
并且您的调用Activity应该像这样实现OnConnectionEstablishedListener
@Override
public void onConnectionEstablished(boolean isConnected) {
new DownloadLatestData().execute();
}
建议:尽管可以通过适当的实现在DownloadLatestData
完成所有这些操作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.