繁体   English   中英

Android中的android.os.NetworkOnMainThreadException问题

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM