Java android中的android.os.NetworkOnMainThreadException问题
我正在检查splash活动上的internet,如果internet可用,我将使用以下方法检查服务器是否联机Java android中的android.os.NetworkOnMainThreadException问题,java,android,Java,Android,我正在检查splash活动上的internet,如果internet可用,我将使用以下方法检查服务器是否联机 private void serverCall() { database = DAO.getInstance(getApplicationContext()); //added by eagleeyes pref = new Setting_preference(this); if (!mIsBackButtonPressed) { pref.ed
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);
让我知道有人能帮我解决这个问题。谢谢您应该在单独的后台线程中进行所有网络呼叫。Android有一个严格的规则,不允许在主线程上进行任何网络调用。尝试在单独的线程内使用类AsyncTask实现IsReachableContext上下文方法 编辑你可以这样尝试
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);
}
}
建议:尽管这一切都可以通过正确的实现在DownloadLatestData中实现。您不需要检查URL是否可访问,只需调用新的DownloadLatestData.execute;如果网络可用
如果失败或成功,请将条件放入asynctask。如果NetworkCheck.isReachableSplashActivity.this{是错误。可能重复将所有NetworkCheck调用移动到您下载的最新数据任务的doInBackground。@Commonware,如果服务器不可用…它的“保持进度”对话框总是…如何在其中设置条件?您能给我一个示例,我如何使用它吗?非常感谢您的优秀编码和示例。我已经创建了connec但是现在混淆了如何将它与我的servercall方法一起使用。你可以检查我是如何使用它的。你能告诉我如何将它与servercall一起使用吗?谢谢
@Override
public void onConnectionEstablished(boolean isConnected) {
new DownloadLatestData().execute();
}