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