Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/221.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java android中的android.os.NetworkOnMainThreadException问题_Java_Android - Fatal编程技术网

Java android中的android.os.NetworkOnMainThreadException问题

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

我正在检查splash活动上的internet,如果internet可用,我将使用以下方法检查服务器是否联机

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();
}