Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.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

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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/118.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 更改MinSDK版本时发生NetworkOnMainThreadException错误_Java_Android - Fatal编程技术网

Java 更改MinSDK版本时发生NetworkOnMainThreadException错误

Java 更改MinSDK版本时发生NetworkOnMainThreadException错误,java,android,Java,Android,我开发了一个登录和注册系统,当minSDKVersion设置为8时,代码运行良好,但是,当我将minSDkVersion更改为更高版本(例如11或12)时,当我尝试登录或注册时,应用程序会崩溃。我应该在代码中进行哪些更改,以便在更高版本中运行。LoginActivity.java文件如下所示: package com.example.trial; import java.util.HashMap; import org.json.JSONException; impo

我开发了一个登录和注册系统,当minSDKVersion设置为8时,代码运行良好,但是,当我将minSDkVersion更改为更高版本(例如11或12)时,当我尝试登录或注册时,应用程序会崩溃。我应该在代码中进行哪些更改,以便在更高版本中运行。LoginActivity.java文件如下所示:

   package com.example.trial;

   import java.util.HashMap;

   import org.json.JSONException;
   import org.json.JSONObject;

   import android.app.Activity;
   import android.content.Intent;
   import android.os.Bundle;
   import android.util.Log;
   import android.view.View;
   import android.widget.Button;
   import android.widget.EditText;
   import android.widget.TextView;

   import com.example.trial.library.DatabaseHandler;
   import com.example.trial.library.UserFunctions;

    public class LoginActivity extends Activity {
Button btnLogin;
Button btnLinkToRegister;
EditText inputEmail;
EditText inputPassword;
TextView loginErrorMsg;

// JSON Response node names
private static String KEY_SUCCESS = "success";
private static String KEY_ERROR = "error";
private static String KEY_ERROR_MSG = "error_msg";
private static String KEY_UID = "uid";
private static String KEY_NAME = "name";
private static String KEY_EMAIL = "email";
private static String KEY_CREATED_AT = "created_at";

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.login);

    // Importing all assets like buttons, text fields
    inputEmail = (EditText) findViewById(R.id.loginEmail);
    inputPassword = (EditText) findViewById(R.id.loginPassword);
    btnLogin = (Button) findViewById(R.id.btnLogin);
    btnLinkToRegister = (Button) findViewById(R.id.btnLinkToRegisterScreen);
    loginErrorMsg = (TextView) findViewById(R.id.login_error);

    // Login button Click Event
    btnLogin.setOnClickListener(new View.OnClickListener() {

        public void onClick(View view) {
            String email = inputEmail.getText().toString();
            String password = inputPassword.getText().toString();
            UserFunctions userFunction = new UserFunctions();
            Log.d("Button", "Login");
            JSONObject json = userFunction.loginUser(email, password);

            // check for login response
            try {
                if (json.getString(KEY_SUCCESS) != null) {
                    loginErrorMsg.setText("");
                    String res = json.getString(KEY_SUCCESS); 
                    if(Integer.parseInt(res) == 1){
                        // user successfully logged in
                        // Store user details in SQLite Database
                        DatabaseHandler db = new DatabaseHandler(getApplicationContext());
                        JSONObject json_user = json.getJSONObject("user");

                        // Clear all previous data in  database
                         userFunction.logoutUser(getApplicationContext());
                         db.addUser(json_user.getString(KEY_NAME), json_user.getString(KEY_EMAIL),  json.getString(KEY_UID), json_user.getString(KEY_CREATED_AT));                      

                        // Launch Dashboard Screen
                        Intent dashboard = new  Intent(getApplicationContext(), DashboardActivity.class);

                        // Close all views before launching Dashboard
                        dashboard.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                        startActivity(dashboard);

                        // Close Login Screen
                        finish();
                    }else{
                        // Error in login
                        loginErrorMsg.setText("Incorrect username/password");
                    }
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    });

    // Link to Register Screen
    btnLinkToRegister.setOnClickListener(new View.OnClickListener() {

        public void onClick(View view) {
            Intent i = new Intent(getApplicationContext(),
                    RegisterActivity.class);
            startActivity(i);
            finish();
        }
    });
     }
     }
RegisterActivity.java文件是:

    package com.example.trial;

    import org.json.JSONException;
    import org.json.JSONObject;

    import com.example.trial.library.DatabaseHandler;
    import com.example.trial.library.UserFunctions;

    import android.app.Activity;
    import android.content.Intent;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.View;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.TextView;

    public class RegisterActivity extends Activity {
Button btnRegister;
Button btnLinkToLogin;
EditText inputFullName;
EditText inputEmail;
EditText inputPassword;
TextView registerErrorMsg;

// JSON Response node names
private static String KEY_SUCCESS = "success";
private static String KEY_ERROR = "error";
private static String KEY_ERROR_MSG = "error_msg";
private static String KEY_UID = "uid";
private static String KEY_NAME = "name";
private static String KEY_EMAIL = "email";
private static String KEY_CREATED_AT = "created_at";

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.register);

    // Importing all assets like buttons, text fields
    inputFullName = (EditText) findViewById(R.id.registerName);
    inputEmail = (EditText) findViewById(R.id.registerEmail);
    inputPassword = (EditText) findViewById(R.id.registerPassword);
    btnRegister = (Button) findViewById(R.id.btnRegister);
    btnLinkToLogin = (Button) findViewById(R.id.btnLinkToLoginScreen);
    registerErrorMsg = (TextView) findViewById(R.id.register_error);

    // Register Button Click event
    btnRegister.setOnClickListener(new View.OnClickListener() {         
        public void onClick(View view) {
            String name = inputFullName.getText().toString();
            String email = inputEmail.getText().toString();
            String password = inputPassword.getText().toString();
            UserFunctions userFunction = new UserFunctions();
            JSONObject json = userFunction.registerUser(name, email, password);

            // check for login response
            try {
                if (json.getString(KEY_SUCCESS) != null) {
                    registerErrorMsg.setText("");
                    String res = json.getString(KEY_SUCCESS); 
                    if(Integer.parseInt(res) == 1){
                        // user successfully registred
                        // Store user details in SQLite Database
                        DatabaseHandler db = new DatabaseHandler(getApplicationContext());
                        JSONObject json_user = json.getJSONObject("user");

                        // Clear all previous data in database
                        userFunction.logoutUser(getApplicationContext());
                        db.addUser(json_user.getString(KEY_NAME), json_user.getString(KEY_EMAIL), json.getString(KEY_UID), json_user.getString(KEY_CREATED_AT));                        
                        // Launch Dashboard Screen
                        Intent dashboard = new Intent(getApplicationContext(), DashboardActivity.class);
                        // Close all views before launching Dashboard
                        dashboard.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                        startActivity(dashboard);
                        // Close Registration Screen
                        finish();
                    }else{
                        // Error in registration
                        registerErrorMsg.setText("Error occured in registration");
                    }
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    });

    // Link to Login Screen
    btnLinkToLogin.setOnClickListener(new View.OnClickListener() {

        public void onClick(View view) {
            Intent i = new Intent(getApplicationContext(),
                    LoginActivity.class);
            startActivity(i);
            // Close Registration View
            finish();
        }
    });
      }
      }
logcat如下所示:

   03-24 01:20:22.154: E/AndroidRuntime(1787): FATAL EXCEPTION: main
   03-24 01:20:22.154: E/AndroidRuntime(1787): android.os.NetworkOnMainThreadException
   03-24 01:20:22.154: E/AndroidRuntime(1787):  at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1133)
   03-24 01:20:22.154: E/AndroidRuntime(1787):  at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:84)
   03-24 01:20:22.154: E/AndroidRuntime(1787):  at libcore.io.IoBridge.connectErrno(IoBridge.java:127)
   03-24 01:20:22.154: E/AndroidRuntime(1787):  at libcore.io.IoBridge.connect(IoBridge.java:112)
   03-24 01:20:22.154: E/AndroidRuntime(1787):  at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192)
   03-24 01:20:22.154: E/AndroidRuntime(1787):  at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:459)
   03-24 01:20:22.154: E/AndroidRuntime(1787):  at java.net.Socket.connect(Socket.java:842)
   03-24 01:20:22.154: E/AndroidRuntime(1787):  at org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:119)
   03-24 01:20:22.154: E/AndroidRuntime(1787):  at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:144)
   03-24 01:20:22.154: E/AndroidRuntime(1787):  at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
   03-24 01:20:22.154: E/AndroidRuntime(1787):  at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
   03-24 01:20:22.154: E/AndroidRuntime(1787):  at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
   03-24 01:20:22.154: E/AndroidRuntime(1787):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
   03-24 01:20:22.154: E/AndroidRuntime(1787):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
   03-24 01:20:22.154: E/AndroidRuntime(1787):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
   03-24 01:20:22.154: E/AndroidRuntime(1787):  at com.example.trial.library.JSONParser.getJSONFromUrl(JSONParser.java:47)
   03-24 01:20:22.154: E/AndroidRuntime(1787):  at com.example.trial.library.UserFunctions.loginUser(UserFunctions.java:43)
   03-24 01:20:22.154: E/AndroidRuntime(1787):  at com.example.trial.LoginActivity$1.onClick(LoginActivity.java:56)
   03-24 01:20:22.154: E/AndroidRuntime(1787):  at android.view.View.performClick(View.java:4240)
   03-24 01:20:22.154: E/AndroidRuntime(1787):  at android.view.View$PerformClick.run(View.java:17721)
   03-24 01:20:22.154: E/AndroidRuntime(1787):  at android.os.Handler.handleCallback(Handler.java:730)
   03-24 01:20:22.154: E/AndroidRuntime(1787):  at android.os.Handler.dispatchMessage(Handler.java:92)
   03-24 01:20:22.154: E/AndroidRuntime(1787):  at android.os.Looper.loop(Looper.java:137)
   03-24 01:20:22.154: E/AndroidRuntime(1787):  at android.app.ActivityThread.main(ActivityThread.java:5103)
   03-24 01:20:22.154: E/AndroidRuntime(1787):  at java.lang.reflect.Method.invokeNative(Native Method)
   03-24 01:20:22.154: E/AndroidRuntime(1787):  at java.lang.reflect.Method.invoke(Method.java:525)
   03-24 01:20:22.154: E/AndroidRuntime(1787):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
   03-24 01:20:22.154: E/AndroidRuntime(1787):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
   03-24 01:20:22.154: E/AndroidRuntime(1787):  at dalvik.system.NativeStart.main(Native Method)

在这里,从api级别11起,您无法在UI线程上执行网络操作

因此,您必须使用异步任务线程

异步任务的示例

 class DowloadTest extends AsyncTask<String, Integer, String>

 {
    @Override
    protected void onPreExecute() {
        pDialog = new ProgressDialog(YourActivityName.this);
        pDialog.setMessage("Please wait..");
        pDialog.setIndeterminate(true);
        pDialog.setCancelable(false);
        pDialog.show();
    };

    @Override
    protected String doInBackground(String... params) {
        // parse your data here
        return null;

    }

    @Override
    protected void onPostExecute(String result) {
        // TODO Auto-generated method stub
        super.onPostExecute(result);

        pDialog.dismiss();

        }

    }
}

有关更多参考,请转到此处,从api级别11起,您不能在UI线程上执行网络操作

因此,您必须使用异步任务线程

异步任务的示例

 class DowloadTest extends AsyncTask<String, Integer, String>

 {
    @Override
    protected void onPreExecute() {
        pDialog = new ProgressDialog(YourActivityName.this);
        pDialog.setMessage("Please wait..");
        pDialog.setIndeterminate(true);
        pDialog.setCancelable(false);
        pDialog.show();
    };

    @Override
    protected String doInBackground(String... params) {
        // parse your data here
        return null;

    }

    @Override
    protected void onPostExecute(String result) {
        // TODO Auto-generated method stub
        super.onPostExecute(result);

        pDialog.dismiss();

        }

    }
}

有关更多参考,请转到此处,从api级别11起,您不能在UI线程上执行网络操作

因此,您必须使用异步任务线程

异步任务的示例

 class DowloadTest extends AsyncTask<String, Integer, String>

 {
    @Override
    protected void onPreExecute() {
        pDialog = new ProgressDialog(YourActivityName.this);
        pDialog.setMessage("Please wait..");
        pDialog.setIndeterminate(true);
        pDialog.setCancelable(false);
        pDialog.show();
    };

    @Override
    protected String doInBackground(String... params) {
        // parse your data here
        return null;

    }

    @Override
    protected void onPostExecute(String result) {
        // TODO Auto-generated method stub
        super.onPostExecute(result);

        pDialog.dismiss();

        }

    }
}

有关更多参考,请转到此处,从api级别11起,您不能在UI线程上执行网络操作

因此,您必须使用异步任务线程

异步任务的示例

 class DowloadTest extends AsyncTask<String, Integer, String>

 {
    @Override
    protected void onPreExecute() {
        pDialog = new ProgressDialog(YourActivityName.this);
        pDialog.setMessage("Please wait..");
        pDialog.setIndeterminate(true);
        pDialog.setCancelable(false);
        pDialog.show();
    };

    @Override
    protected String doInBackground(String... params) {
        // parse your data here
        return null;

    }

    @Override
    protected void onPostExecute(String result) {
        // TODO Auto-generated method stub
        super.onPostExecute(result);

        pDialog.dismiss();

        }

    }
}

有关更多参考信息,请转到

//您可以在异步任务类中添加json代码

  class callservice extends AsyncTask<String, String, String>
  {
    private ProgressDialog pDialog;
    String message = "";
    private String result;

    /**
     * Before starting background thread Show Progress Dialog
     * */
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        pDialog = new ProgressDialog(MainActivity.this);
        pDialog.setCancelable(false);
        pDialog.show();
    }
    /**
     * getting All products from url
     * */
    protected String doInBackground(String... args)
    {
         // Write your json code which get data

    }

    /**
     * After completing background task Dismiss the progress dialog
     * **/
    protected void onPostExecute(String file_url)
    {
        // dismiss the dialog after getting all products
        if (pDialog != null)
            pDialog.dismiss();

    }
}
class callservice扩展了异步任务
{
私人对话;
字符串消息=”;
私有字符串结果;
/**
*在启动后台线程显示进度对话框之前
* */
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
pDialog=新建进度对话框(MainActivity.this);
pDialog.setCancelable(假);
pDialog.show();
}
/**
*从url获取所有产品
* */
受保护的字符串doInBackground(字符串…args)
{
//编写获取数据的json代码
}
/**
*完成后台任务后,关闭“进度”对话框
* **/
受保护的void onPostExecute(字符串文件\u url)
{
//获取所有产品后关闭对话框
如果(pDialog!=null)
pDialog.disclose();
}
}

//您可以在异步任务类中添加json代码

  class callservice extends AsyncTask<String, String, String>
  {
    private ProgressDialog pDialog;
    String message = "";
    private String result;

    /**
     * Before starting background thread Show Progress Dialog
     * */
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        pDialog = new ProgressDialog(MainActivity.this);
        pDialog.setCancelable(false);
        pDialog.show();
    }
    /**
     * getting All products from url
     * */
    protected String doInBackground(String... args)
    {
         // Write your json code which get data

    }

    /**
     * After completing background task Dismiss the progress dialog
     * **/
    protected void onPostExecute(String file_url)
    {
        // dismiss the dialog after getting all products
        if (pDialog != null)
            pDialog.dismiss();

    }
}
class callservice扩展了异步任务
{
私人对话;
字符串消息=”;
私有字符串结果;
/**
*在启动后台线程显示进度对话框之前
* */
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
pDialog=新建进度对话框(MainActivity.this);
pDialog.setCancelable(假);
pDialog.show();
}
/**
*从url获取所有产品
* */
受保护的字符串doInBackground(字符串…args)
{
//编写获取数据的json代码
}
/**
*完成后台任务后,关闭“进度”对话框
* **/
受保护的void onPostExecute(字符串文件\u url)
{
//获取所有产品后关闭对话框
如果(pDialog!=null)
pDialog.disclose();
}
}

//您可以在异步任务类中添加json代码

  class callservice extends AsyncTask<String, String, String>
  {
    private ProgressDialog pDialog;
    String message = "";
    private String result;

    /**
     * Before starting background thread Show Progress Dialog
     * */
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        pDialog = new ProgressDialog(MainActivity.this);
        pDialog.setCancelable(false);
        pDialog.show();
    }
    /**
     * getting All products from url
     * */
    protected String doInBackground(String... args)
    {
         // Write your json code which get data

    }

    /**
     * After completing background task Dismiss the progress dialog
     * **/
    protected void onPostExecute(String file_url)
    {
        // dismiss the dialog after getting all products
        if (pDialog != null)
            pDialog.dismiss();

    }
}
class callservice扩展了异步任务
{
私人对话;
字符串消息=”;
私有字符串结果;
/**
*在启动后台线程显示进度对话框之前
* */
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
pDialog=新建进度对话框(MainActivity.this);
pDialog.setCancelable(假);
pDialog.show();
}
/**
*从url获取所有产品
* */
受保护的字符串doInBackground(字符串…args)
{
//编写获取数据的json代码
}
/**
*完成后台任务后,关闭“进度”对话框
* **/
受保护的void onPostExecute(字符串文件\u url)
{
//获取所有产品后关闭对话框
如果(pDialog!=null)
pDialog.disclose();
}
}

//您可以在异步任务类中添加json代码

  class callservice extends AsyncTask<String, String, String>
  {
    private ProgressDialog pDialog;
    String message = "";
    private String result;

    /**
     * Before starting background thread Show Progress Dialog
     * */
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        pDialog = new ProgressDialog(MainActivity.this);
        pDialog.setCancelable(false);
        pDialog.show();
    }
    /**
     * getting All products from url
     * */
    protected String doInBackground(String... args)
    {
         // Write your json code which get data

    }

    /**
     * After completing background task Dismiss the progress dialog
     * **/
    protected void onPostExecute(String file_url)
    {
        // dismiss the dialog after getting all products
        if (pDialog != null)
            pDialog.dismiss();

    }
}
class callservice扩展了异步任务
{
私人对话;
字符串消息=”;
私有字符串结果;
/**
*在启动后台线程显示进度对话框之前
* */
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
pDialog=新建进度对话框(MainActivity.this);
pDialog.setCancelable(假);
pDialog.show();
}
/**
*从url获取所有产品
* */
受保护的字符串doInBackground(字符串…args)
{
//编写获取数据的json代码
}
/**
*完成后台任务后,关闭“进度”对话框
* **/
受保护的void onPostExecute(字符串文件\u url)
{
//获取所有产品后关闭对话框
如果(pDialog!=null)
pDialog.disclose();
}
}

我也面临同样的问题,对我有效的解决方案是:

如果不希望在活动中使用AsyncTask,请尝试在onCreate的LoginActivity.java中添加以下代码段

if (android.os.Build.VERSION.SDK_INT > 9) {
        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
        StrictMode.setThreadPolicy(policy);
    }
因此,这将节省您解决此错误的时间和精力

另外,如果在将这些内容添加到“活动”后,在这些行中出现错误,请尝试清理应用程序。您也可以尝试添加

@SuppressLint(“新API”) 在oncreate方法之前。像这样,

@SuppressLint("NewApi")
@Override
public void onCreate(Bundle savedInstanceState) {

希望这也能对你有所帮助。

我也面临同样的问题,对我有效的解决方案是:

Bcoz of your SDK tools are maybe Upgrade version doesnt support.. for example you create your project in SDK min level is 8 but your android SDk version tools is APK level 19 means it may occurs so go to your SDk Folder and delete tools Folder and then Copy your cuurent version of SDk tools must be put it in your SDK Folder.
you are using low level APK version means it will generate this line bcoz you want to access high high level code in Upgrade version supported methods means this lines will shows of your methods..

@SuppressLint("NewApi")
@Override
public void onCreate(Bundle savedInstanceState) {

and also set this line in your activity

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) {
            int shortAnimTime = getResources().getInteger(
                    android.R.integer.config_shortAnimTime);
or 
if (android.os.Build.VERSION.SDK_INT > 9) {
        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
        StrictMode.setThreadPolicy(policy);
    }


thank you.
如果不希望在活动中使用AsyncTask,请尝试在onCreate的LoginActivity.java中添加以下代码段

if (android.os.Build.VERSION.SDK_INT > 9) {
        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
        StrictMode.setThreadPolicy(policy);
    }
因此,这将节省您解决此错误的时间和精力

另外,如果在将这些内容添加到活动中后,在这些行中出现错误,请尝试cleanin