android.os.NetworkOnMainThreadException在android.os.StrictMode $ AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1145) [英] android.os.NetworkOnMainThreadException at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1145)

查看:230
本文介绍了android.os.NetworkOnMainThreadException在android.os.StrictMode $ AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1145)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我发展我的第一个Android应用程序,并已建成主要是基于研究。当我尝试登录我的用户,我得到了 android.os.NetworkOnMainThreadException 错误。我看了网上说异步应该用于确保不会发生这种错误,但我不知道该怎么做。

下面是我所有的code。

我的用户登录形式的活动:

 进口的java.util.HashMap;
    进口org.json.JSONException;
    进口org.json.JSONObject;
    进口android.app.Activity;
    进口android.content.Intent;
    进口android.os.Bundle;
    进口android.util.Log;
    进口android.view.View;
    进口android.widget.Button;
    进口android.widget.EditText;
    进口android.widget.TextView;
    进口com.finecalc.library.DatabaseHandler;
    进口com.finecalc.library.UserFunctions;
    公共类用户登陆扩展活动{
    按钮用户登陆;
    按钮后退;
    按钮登录;
    的EditText inputEmail;
    的EditText控件inputPassword;
    TextView的loginErrorMsg;// JSON响应节点名称
私人静态字符串KEY_SUCCESS =成功;
私人静态字符串KEY_ERROR =错误;
私人静态字符串KEY_ERROR_MSG =ERROR_MSG;
私人静态字符串KEY_UID =UID;
私人静态字符串KEY_NAME =名;
私人静态字符串KEY_EMAIL =电子邮件;
私人静态字符串KEY_CREATED_AT =created_at;@覆盖
公共无效的onCreate(捆绑savedInstanceState){
    super.onCreate(savedInstanceState);
    的setContentView(R.layout.user_login);    //导入所有的资产如按钮,文本字段
    inputEmail =(EditText上)findViewById(R.id.inputemail);
    控件inputPassword =(EditText上)findViewById(R.id.inputpassword);
    登录=(按钮)findViewById(R.id.login);
    //按钮寄存器=(按钮)findViewById(R.id.register);
    回到=(按钮)findViewById(R.id.back);    loginErrorMsg =(的TextView)findViewById(R.id.login_error);    //登录按钮单击事件
    login.setOnClickListener(新View.OnClickListener(){        公共无效的onClick(查看视图){
            。字符串email = inputEmail.getText()的toString();
            。字符串密码= inputPassword.getText()的toString();
            UserFunctions userFunction =新UserFunctions();
            JSONObject的JSON = userFunction.loginUser(电子邮件,密码);            //检查登录响应
            尝试{
                //如果(json.getString(KEY_SUCCESS)!= NULL){
                如果(JSON = NULL&放大器;!&安培;!(JSON).isNull(KEY_SUCCESS)){
                    loginErrorMsg.setText();
                    字符串资源= json.getString(KEY_SUCCESS);
                    如果(的Integer.parseInt(RES)== 1){
                        //用户成功登录
                        在SQLite数据库//存储用户详细信息
                        数据库处理器分贝=新数据库处理器(getApplicationContext());
                        JSONObject的json_user = json.getJSONObject(用户);                        //清除数据库中的所有previous数据
                        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));                        //启动仪表盘屏幕
                        仪表盘意向=新意图(getApplicationContext(),DashboardActivity.class);                        //启动仪表板之前关闭所有的意见
                        dashboard.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                        startActivity(仪表盘);                        //关闭登录屏幕
                        完();                    }其他{
                        //错误的登录
                        loginErrorMsg.setText(不正确的用户名/密码);
                    }
                }
            }赶上(JSONException E){
                e.printStackTrace();
            }
        }
    });}
   }

数据库处理器

 进口的java.util.HashMap;
     进口android.content.ContentValues​​;
     进口android.content.Context;
     进口android.database.Cursor;
     进口android.database.sqlite.SQLiteDatabase;
     进口android.database.sqlite.SQLiteOpenHelper;    公共类数据库处理器扩展SQLiteOpenHelper {//所有静态变量
//数据库版本
私有静态最终诠释DATABASE_VERSION = 1;//数据库名称
私有静态最后弦乐DATABASE_NAME =androidlta_api;//登录表名
私有静态最后弦乐TABLE_LOGIN =登录;//登录表列名
私有静态最后弦乐KEY_ID =ID;
私有静态最后弦乐KEY_NAME =名;
私有静态最后弦乐KEY_EMAIL =电子邮件;
私有静态最后弦乐KEY_UID =UID;
私有静态最后弦乐KEY_CREATED_AT =created_at;公共数据库处理器(上下文的背景下){
    超(背景下,DATABASE_NAME,空,DATABASE_VERSION);
}//创建表
@覆盖
公共无效的onCreate(SQLiteDatabase DB){
    字符串CREATE_LOGIN_TABLE =CREATE TABLE+ TABLE_LOGIN +(
            + KEY_ID +INTEGER PRIMARY KEY
            + KEY_NAME +TEXT
            + KEY_EMAIL +TEXT独一无二的,
            + KEY_UID +TEXT
            + KEY_CREATED_AT +TEXT+);
    db.execSQL(CREATE_LOGIN_TABLE);
}//数据库升级
@覆盖
公共无效onUpgrade(SQLiteDatabase分贝,INT oldVersion,诠释静态网页){
    如果存在//删除旧的表
    db.execSQL(DROP TABLE IF EXISTS+ TABLE_LOGIN);    //再次创建表
    的onCreate(DB);
}/ **
 *存储用户数据库的详细信息
 * * /
公共无效ADDUSER(字符串名称,字符串电子邮件,UID字符串,字符串created_at){
    SQLiteDatabase分贝= this.getWritableDatabase();    ContentValues​​值=新ContentValues​​();
    values​​.put(KEY_NAME,名); // 名称
    values​​.put(KEY_EMAIL,电子邮件); //电子邮件
    values​​.put(KEY_UID,UID); //电子邮件
    values​​.put(KEY_CREATED_AT,created_at); //创建在    //插入行
    db.insert(TABLE_LOGIN,空,价值);
    db.close(); //关闭数据库连接
}/ **
 *充分利用数据库​​中的用户数据
 * * /
公众的HashMap<字符串,字符串> getUserDetails(){
    HashMap的<字符串,字符串>用户=新的HashMap<字符串,字符串>();
    字符串selectQuery =SELECT * FROM+ TABLE_LOGIN;    SQLiteDatabase分贝= this.getReadableDatabase();
    光标光标= db.rawQuery(selectQuery,NULL);
    //移到第一行
    cursor.moveToFirst();
    如果(cursor.getCount()大于0){
        user.put(姓名,cursor.getString(1));
        user.put(电子邮件,cursor.getString(2));
        user.put(UID,cursor.getString(3));
        user.put(created_at,cursor.getString(4));
    }
    cursor.close();
    db.close();
    //回报用户
    返回用户;
}/ **
 *获取用户的登录状态
 *如果行是返回真有表
 * * /
公众诠释getRowCount(){
    字符串countQuery =SELECT * FROM+ TABLE_LOGIN;
    SQLiteDatabase分贝= this.getReadableDatabase();
    光标光标= db.rawQuery(countQuery,NULL);
    INT rowCount等= cursor.getCount();
    db.close();
    cursor.close();    //返回行计数
    返回rowCount等;
}/ **
 *重新箱子数据库
 *删除所有表并重新创建它们
 * * /
公共无效resetTables(){
    SQLiteDatabase分贝= this.getWritableDatabase();
    //删除所有行
    db.delete(TABLE_LOGIN,NULL,NULL);
    db.close();
}   }

UserFunctions

 进口的java.util.ArrayList;
      进口的java.util.List;      进口org.apache.http.NameValuePair;
      进口org.apache.http.message.BasicNameValuePair;
      进口org.json.JSONObject;
       进口android.content.Context;
       进口android.util.Log;      公共类UserFunctions {私人JSONParser jsonParser;//测试使用LAMP本地主机私人静态字符串loginURL =htt​​p://127.0.0.1/android_api/index.php;
私人静态字符串REGISTERURL =htt​​p://127.0.0.1/android_api/index.php;私人静态字符串login_tag =登录;
私人静态字符串register_tag =注册;//构造
公共UserFunctions(){
    jsonParser =新JSONParser();
}/ **
 *功能使登录请求
 * @参数电子邮件
 * @参数密码
 * * /
公众的JSONObject loginUser(字符串电子邮件,字符串密码){
    //大厦参数
    清单<&的NameValuePair GT; PARAMS =新的ArrayList<&的NameValuePair GT;();
    params.add(新BasicNameValuePair(标签,login_tag));
    params.add(新BasicNameValuePair(电子邮件,电子邮件));
    params.add(新BasicNameValuePair(密码,密码));
    JSONObject的JSON = jsonParser.getJSONFromUrl(loginURL,则params);
    //返回JSON
    // Log.e(JSON,json.toString());
    返回JSON;
}/ **
 *功能使登录请求
 * @参数名称
 * @参数电子邮件
 * @参数密码
 * * /
公众的JSONObject registerUser(字符串名称,字符串licencenumber,电子邮件字符串,字符串密码){
    //大厦参数
    清单<&的NameValuePair GT; PARAMS =新的ArrayList<&的NameValuePair GT;();
    params.add(新BasicNameValuePair(标签,register_tag));
    params.add(新BasicNameValuePair(姓名,名字));
    params.add(新BasicNameValuePair(licencenumber,licencenumber));
    params.add(新BasicNameValuePair(电子邮件,电子邮件));
    params.add(新BasicNameValuePair(密码,密码));    //获取JSON对象
    JSONObject的JSON = jsonParser.getJSONFromUrl(REGISTERURL,则params);
    //返回JSON
    返回JSON;
}/ **
 *函数来获取登录状态
 * * /
公共布尔isUserLoggedIn(上下文的背景下){
    数据库处理器DB =新的数据库处理器(背景);
    诠释计数= db.getRowCount();
    如果(计数大于0){
        //用户登录
        返回true;
    }
    返回false;
}/ **
 *功能注销用户
 *复位数据库
 * * /
公共布尔logoutUser(上下文的背景下){
    数据库处理器DB =新的数据库处理器(背景);
    db.resetTables();
    返回true;
}      }

JSONParser

 进口java.io.BufferedReader中;
      进口java.io.IOException异常;
      进口的java.io.InputStream;
      进口java.io.InputStreamReader中;
      进口java.io.UnsupportedEncodingException;
      进口的java.util.List;
      进口org.apache.http.HttpEntity;
      进口org.apache.http.Htt presponse;
      进口org.apache.http.NameValuePair;
      进口org.apache.http.client.ClientProtocolException;
      进口org.apache.http.client.entity.UrlEn codedFormEntity;
      进口org.apache.http.client.methods.HttpPost;
      进口org.apache.http.impl.client.DefaultHttpClient;
      进口org.json.JSONException;
      进口org.json.JSONObject;      进口android.util.Log;      公共类JSONParser {静态InputStream为= NULL;
静态的JSONObject jObj = NULL;
静态JSON字符串=;//构造
公共JSONParser(){}公众的JSONObject getJSONFromUrl(字符串URL,列表和LT;&的NameValuePair GT; PARAMS){    //使HTTP请求
    尝试{
        // defaultHttpClient
        DefaultHttpClient的HttpClient =新DefaultHttpClient();
        HttpPost httpPost =新HttpPost(URL);
        httpPost.setEntity(新UrlEn codedFormEntity(PARAMS));        HTT presponse HTT presponse = httpClient.execute(httpPost);
        HttpEntity httpEntity = HTT presponse.getEntity();
        是= httpEntity.getContent();    }赶上(UnsupportedEncodingException五){
        e.printStackTrace();
    }赶上(ClientProtocolException E){
        e.printStackTrace();
    }赶上(IOException异常五){
        e.printStackTrace();
    }    尝试{
        读者的BufferedReader =新的BufferedReader(新的InputStreamReader(
                是,ISO-8859-1),8);
        StringBuilder的SB =新的StringBuilder();
        串线= NULL;
        而((行= reader.readLine())!= NULL){
            sb.append(线+的n);
        }
        is.close();
        JSON = sb.toString();
       // Log.e(JSON,JSON);
    }赶上(例外五){
        Log.e(缓冲区错误,错误转换结果+ e.toString());
    }    //尝试分析字符串到一个JSON对象
    尝试{
        jObj =新的JSONObject(JSON);
    }赶上(JSONException E){
        Log.e(JSON解析器,错误分析数据+ e.toString());
    }    //返回JSON字符串
    返回jObj;}

}

我AndroidManifest还包括:结果
<使用许可权的android:name =android.permission.INTERNET对/>

下面是我的错误:

 四月八日至2日:39:23.410:D /(2642):HostConnection ::得到()新主机连接建立0xb97a3b90,TID 2642
4月8日至2日:39:23.480:W / EGL_emulation(2642):eglSurfaceAttrib没有实现
4月8日至2日:39:23.480:D / OpenGLRenderer(2642):启用调试模式0
4月8日至2日:39:29.150:W / EGL_emulation(2642):eglSurfaceAttrib没有实现
4月8日至2日:39:33.650:D / InputEventConsistencyVerifier(2642):KeyEvent的:ACTION_UP但关键是不下来。
4月8日至2日:39:33.650:D / InputEventConsistencyVerifier(2642):在android.widget.EditText {b1fa92d8 VFED..CL .F ...... 0,82-240,118#7f07001c应用:ID /控件inputPassword}
4月8日至2日:39:33.650:D / InputEventConsistencyVerifier(2642):0:71337.34亿派,KeyEvent的{行动= ACTION_UP,关键code = KEY code_TAB,扫描code = 15,亚状态= 0,旗帜= 0x8中,的repeatCount = 0,EVENTTIME = 7133734,停工= 7133655,DEVICEID = 0,源= 0x101}
4月8日至2日:39:38.231:D / dalvikvm(2642):GC_FOR_ALLOC释放177K,8%的免费2964K / 3192K,暂停21ms,总24ms
4月8日至2日:39:38.321:D / AndroidRuntime(2642):关闭VM
4月8日至2日:39:38.321:W / dalvikvm(2642):主题ID = 1:螺纹未捕获的异常退出(组= 0xb1cd3b20)
4月8日至2日:39:38.331:E / AndroidRuntime(2642):致命异常:主要
4月8日至2日:39:38.331:E / AndroidRuntime(2642):工艺:com.finecalc.ltafinecalculator,PID:2642
4月8日至2日:39:38.331:E / AndroidRuntime(2642):android.os.NetworkOnMainThreadException
4月8日至2日:39:38.331:E / AndroidRuntime(2642):在android.os.StrictMode $ AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1145)
4月8日至2日:39:38.331:E / AndroidRuntime(2642):在libcore.io.BlockGuardOs.connect(BlockGuardOs.java:84)
4月8日至2日:39:38.331:E / AndroidRuntime(2642):在libcore.io.IoBridge.connectErrno(IoBridge.java:127)
4月8日至2日:39:38.331:E / AndroidRuntime(2642):在libcore.io.IoBridge.connect(IoBridge.java:112)
4月8日至2日:39:38.331:E / AndroidRuntime(2642):在java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192)
4月8日至2日:39:38.331:E / AndroidRuntime(2642):在java.net.PlainSocketImpl.connect(PlainSocketImpl.java:459)
4月8日至2日:39:38.331:E / AndroidRuntime(2642):在java.net.Socket.connect(Socket.java:843)
4月8日至2日:39:38.331:E / AndroidRuntime(2642):在org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:119)
4月8日至2日:39:38.331:E / AndroidRuntime(2642):在org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:144)
4月8日至2日:39:38.331:E / AndroidRuntime(2642):在org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
4月8日至2日:39:38.331:E / AndroidRuntime(2642):在org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
4月8日至2日:39:38.331:E / AndroidRuntime(2642):在org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
4月8日至2日:39:38.331:E / AndroidRuntime(2642):在org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
4月8日至2日:39:38.331:E / AndroidRuntime(2642):在org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
4月8日至2日:39:38.331:E / AndroidRuntime(2642):在org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
4月8日至2日:39:38.331:E / AndroidRuntime(2642):在com.finecalc.library.JSONParser.getJSONFromUrl(JSONParser.java:41)
4月8日至2日:39:38.331:E / AndroidRuntime(2642):在com.finecalc.library.UserFunctions.loginUser(UserFunctions.java:42)
4月8日至2日:39:38.331:E / AndroidRuntime(2642):在com.finecalc.ltafinecalculator.UserLogin $ 1.onClick(UserLogin.java:57)
4月8日至2日:39:38.331:E / AndroidRuntime(2642):在android.view.View.performClick(View.java:4438)
4月8日至2日:39:38.331:E / AndroidRuntime(2642):在android.view.View $ PerformClick.run(View.java:18422)
4月8日至2日:39:38.331:E / AndroidRuntime(2642):在android.os.Handler.handleCallback(Handler.java:733)
4月8日至2日:39:38.331:E / AndroidRuntime(2642):在android.os.Handler.dispatchMessage(Handler.java:95)
4月8日至2日:39:38.331:E / AndroidRuntime(2642):在android.os.Looper.loop(Looper.java:136)
4月8日至2日:39:38.331:E / AndroidRuntime(2642):在android.app.ActivityThread.main(ActivityThread.java:5017)
4月8日至2日:39:38.331:E / AndroidRuntime(2642):在java.lang.reflect.Method.invokeNative(本机方法)
4月8日至2日:39:38.331:E / AndroidRuntime(2642):在java.lang.reflect.Method.invoke(Method.java:515)
4月8日至2日:39:38.331:E / AndroidRuntime(2642):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:779)
4月8日至2日:39:38.331:E / AndroidRuntime(2642):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
4月8日至2日:39:38.331:E / AndroidRuntime(2642):在dalvik.system.NativeStart.main(本机方法)
4月8日至2日:39:41.111:D /(2670):HostConnection ::得到()新主机连接建立0xb97a3cc0,TID 2670
4月8日至2日:39:41.181:W / EGL_emulation(2670):eglSurfaceAttrib没有实现
4月8日至2日:39:41.181:D / OpenGLRenderer(2670):启用调试模式0
4月8日至2日:39:45.771:W / EGL_emulation(2670):eglSurfaceAttrib没有实现
4月8日至2日:39:48.371:W / EGL_emulation(2670):eglSurfaceAttrib没有实现
4月8日至2日:39:50.971:D / dalvikvm(2670):GC_FOR_ALLOC释放123K,6%免费3018K / 3192K,暂停28ms,共为32ms
4月8日至2日:39:51.581:W / EGL_emulation(2670):eglSurfaceAttrib没有实现
4月8日至2日:39:51.811:D / dalvikvm(2670):GC_FOR_ALLOC释放152K,6%免费3380K / 3584K,暂停22毫秒,31毫秒总
4月8日至2日:40:18.351:W / EGL_emulation(2670):eglSurfaceAttrib没有实现
4月8日至2日:40:21.741:W / EGL_emulation(2670):eglSurfaceAttrib没有实现
4月8日至2日:40:23.021:D / AndroidRuntime(2670):关闭VM
4月8日至2日:40:23.021:W / dalvikvm(2670):主题ID = 1:螺纹未捕获的异常退出(组= 0xb1cd3b20)
4月8日至2日:40:23.031:E / AndroidRuntime(2670):致命异常:主要
4月8日至2日:40:23.031:E / AndroidRuntime(2670):工艺:com.finecalc.ltafinecalculator,PID:2670
4月8日至2日:40:23.031:E / AndroidRuntime(2670):了java.lang.RuntimeException:无法启动活动ComponentInfo {com.finecalc.ltafinecalculator / com.finecalc.ltafinecalculator.UserRegister}:显示java.lang.NullPointerException
4月8日至2日:40:23.031:E / AndroidRuntime(2670):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2195)
4月8日至2日:40:23.031:E / AndroidRuntime(2670):在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
4月8日至2日:40:23.031:E / AndroidRuntime(2670):在android.app.ActivityThread.access $ 800(ActivityThread.java:135)
4月8日至2日:40:23.031:E / AndroidRuntime(2670):在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1196)
4月8日至2日:40:23.031:E / AndroidRuntime(2670):在android.os.Handler.dispatchMessage(Handler.java:102)
4月8日至2日:40:23.031:E / AndroidRuntime(2670):在android.os.Looper.loop(Looper.java:136)
4月8日至2日:40:23.031:E / AndroidRuntime(2670):在android.app.ActivityThread.main(ActivityThread.java:5017)
4月8日至2日:40:23.031:E / AndroidRuntime(2670):在java.lang.reflect.Method.invokeNative(本机方法)
4月8日至2日:40:23.031:E / AndroidRuntime(2670):在java.lang.reflect.Method.invoke(Method.java:515)
4月8日至2日:40:23.031:E / AndroidRuntime(2670):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:779)
4月8日至2日:40:23.031:E / AndroidRuntime(2670):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
4月8日至2日:40:23.031:E / AndroidRuntime(2670):在dalvik.system.NativeStart.main(本机方法)
4月8日至2日:40:23.031:E / AndroidRuntime(2670):因:显示java.lang.NullPointerException
4月8日至2日:40:23.031:E / AndroidRuntime(2670):在com.finecalc.ltafinecalculator.UserRegister.onCreate(UserRegister.java:26)
4月8日至2日:40:23.031:E / AndroidRuntime(2670):在android.app.Activity.performCreate(Activity.java:5231)
4月8日至2日:40:23.031:E / AndroidRuntime(2670):在android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
4月8日至2日:40:23.031:E / AndroidRuntime(2670):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159)
4月8日至2日:40:23.031:E / AndroidRuntime(2670):11 ...更多


解决方案

当应用程序试图在主线程中执行网络操作时抛出此异常。使用下面code在onViewCreated避免这种错误其他呼叫您的网络操作(从服务器上获取数据)请求的线程或非同步类。

 公共无效onViewCreated(查看视图,捆绑savedInstanceState)
{
    INT SDK_INT = android.os.Build.VERSION.SDK_INT;
    如果(SDK_INT→8)
    {
        StrictMode.ThreadPolicy政策=新StrictMode.ThreadPolicy.Builder()
                .permitAll()建立()。
        StrictMode.setThreadPolicy(政策);
        //你的codeS这里    }
}

I am developing my first Android app and had built in mostly based on research. When I try to login my user I get the android.os.NetworkOnMainThreadException error. I have read online that Async should be used to make sure that this error doesn't occur but I have no idea how to do that.

Below is all my code.

My User Login Form Activity:

    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.finecalc.library.DatabaseHandler;
    import com.finecalc.library.UserFunctions;


    public class UserLogin extends Activity {
    Button userlogin;
    Button back;
    Button login;
    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.user_login);

    // Importing all assets like buttons, text fields
    inputEmail = (EditText) findViewById(R.id.inputemail);
    inputPassword = (EditText) findViewById(R.id.inputpassword);
    login = (Button) findViewById(R.id.login);
    //Button register = (Button) findViewById(R.id.register);
    back =(Button)findViewById(R.id.back);

    loginErrorMsg = (TextView) findViewById(R.id.login_error);

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

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

            // check for login response
            try {
                //if (json.getString(KEY_SUCCESS) != null) {
                if(json != null && !(json).isNull(KEY_SUCCESS)){
                    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();
            }
        }
    });



}
   }

DatabaseHandler

     import java.util.HashMap;
     import android.content.ContentValues;
     import android.content.Context;
     import android.database.Cursor;
     import android.database.sqlite.SQLiteDatabase;
     import android.database.sqlite.SQLiteOpenHelper;

    public class DatabaseHandler extends SQLiteOpenHelper {

// All Static variables
// Database Version
private static final int DATABASE_VERSION = 1;

// Database Name
private static final String DATABASE_NAME = "androidlta_api";

// Login table name
private static final String TABLE_LOGIN = "login";

// Login Table Columns names
private static final String KEY_ID = "id";
private static final String KEY_NAME = "name";
private static final String KEY_EMAIL = "email";
private static final String KEY_UID = "uid";
private static final String KEY_CREATED_AT = "created_at";

public DatabaseHandler(Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
}

// Creating Tables
@Override
public void onCreate(SQLiteDatabase db) {
    String CREATE_LOGIN_TABLE = "CREATE TABLE " + TABLE_LOGIN + "("
            + KEY_ID + " INTEGER PRIMARY KEY,"
            + KEY_NAME + " TEXT,"
            + KEY_EMAIL + " TEXT UNIQUE,"
            + KEY_UID + " TEXT,"
            + KEY_CREATED_AT + " TEXT" + ")";
    db.execSQL(CREATE_LOGIN_TABLE);
}

// Upgrading database
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    // Drop older table if existed
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_LOGIN);

    // Create tables again
    onCreate(db);
}

/**
 * Storing user details in database
 * */
public void addUser(String name, String email, String uid, String created_at) {
    SQLiteDatabase db = this.getWritableDatabase();

    ContentValues values = new ContentValues();
    values.put(KEY_NAME, name); // Name
    values.put(KEY_EMAIL, email); // Email
    values.put(KEY_UID, uid); // Email
    values.put(KEY_CREATED_AT, created_at); // Created At

    // Inserting Row
    db.insert(TABLE_LOGIN, null, values);
    db.close(); // Closing database connection
}

/**
 * Getting user data from database
 * */
public HashMap<String, String> getUserDetails(){
    HashMap<String,String> user = new HashMap<String,String>();
    String selectQuery = "SELECT  * FROM " + TABLE_LOGIN;

    SQLiteDatabase db = this.getReadableDatabase();
    Cursor cursor = db.rawQuery(selectQuery, null);
    // Move to first row
    cursor.moveToFirst();
    if(cursor.getCount() > 0){
        user.put("name", cursor.getString(1));
        user.put("email", cursor.getString(2));
        user.put("uid", cursor.getString(3));
        user.put("created_at", cursor.getString(4));
    }
    cursor.close();
    db.close();
    // return user
    return user;
}

/**
 * Getting user login status
 * return true if rows are there in table
 * */
public int getRowCount() {
    String countQuery = "SELECT  * FROM " + TABLE_LOGIN;
    SQLiteDatabase db = this.getReadableDatabase();
    Cursor cursor = db.rawQuery(countQuery, null);
    int rowCount = cursor.getCount();
    db.close();
    cursor.close();

    // return row count
    return rowCount;
}

/**
 * Re crate database
 * Delete all tables and create them again
 * */
public void resetTables(){
    SQLiteDatabase db = this.getWritableDatabase();
    // Delete All Rows
    db.delete(TABLE_LOGIN, null, null);
    db.close();
}

   }

UserFunctions

      import java.util.ArrayList;
      import java.util.List;

      import org.apache.http.NameValuePair;
      import org.apache.http.message.BasicNameValuePair;
      import org.json.JSONObject;


       import android.content.Context;
       import android.util.Log;

      public class UserFunctions {

private JSONParser jsonParser;

// Testing in localhost using LAMP

private static String loginURL = "http://127.0.0.1/android_api/index.php";
private static String registerURL = "http://127.0.0.1/android_api/index.php";

private static String login_tag = "login";
private static String register_tag = "register";

// constructor
public UserFunctions(){
    jsonParser = new JSONParser();
}

/**
 * function make Login Request
 * @param email
 * @param password
 * */
public JSONObject loginUser(String email, String password){
    // Building Parameters
    List<NameValuePair> params = new ArrayList<NameValuePair>();
    params.add(new BasicNameValuePair("tag", login_tag));
    params.add(new BasicNameValuePair("email", email));
    params.add(new BasicNameValuePair("password", password));
    JSONObject json = jsonParser.getJSONFromUrl(loginURL, params);
    // return json
    // Log.e("JSON", json.toString());
    return json;
}

/**
 * function make Login Request
 * @param name
 * @param email
 * @param password
 * */
public JSONObject registerUser(String name, String licencenumber, String email, String password){
    // Building Parameters
    List<NameValuePair> params = new ArrayList<NameValuePair>();
    params.add(new BasicNameValuePair("tag", register_tag));
    params.add(new BasicNameValuePair("name", name));
    params.add(new BasicNameValuePair("licencenumber",licencenumber));
    params.add(new BasicNameValuePair("email", email));
    params.add(new BasicNameValuePair("password", password));

    // getting JSON Object
    JSONObject json = jsonParser.getJSONFromUrl(registerURL, params);
    // return json
    return json;
}

/**
 * Function get Login status
 * */
public boolean isUserLoggedIn(Context context){
    DatabaseHandler db = new DatabaseHandler(context);
    int count = db.getRowCount();
    if(count > 0){
        // user logged in
        return true;
    }
    return false;
}

/**
 * Function to logout user
 * Reset Database
 * */
public boolean logoutUser(Context context){
    DatabaseHandler db = new DatabaseHandler(context);
    db.resetTables();
    return true;
}

      }

JSONParser

      import java.io.BufferedReader;
      import java.io.IOException;
      import java.io.InputStream;
      import java.io.InputStreamReader;
      import java.io.UnsupportedEncodingException;
      import java.util.List;
      import org.apache.http.HttpEntity;
      import org.apache.http.HttpResponse;
      import org.apache.http.NameValuePair;
      import org.apache.http.client.ClientProtocolException;
      import org.apache.http.client.entity.UrlEncodedFormEntity;
      import org.apache.http.client.methods.HttpPost;
      import org.apache.http.impl.client.DefaultHttpClient;
      import org.json.JSONException;
      import org.json.JSONObject;

      import android.util.Log;

      public class JSONParser {

static InputStream is = null;
static JSONObject jObj = null;
static String json = "";

// constructor
public JSONParser() {

}

public JSONObject getJSONFromUrl(String url, List<NameValuePair> params) {

    // Making HTTP request
    try {
        // defaultHttpClient
        DefaultHttpClient httpClient = new DefaultHttpClient();
        HttpPost httpPost = new HttpPost(url);
        httpPost.setEntity(new UrlEncodedFormEntity(params));

        HttpResponse httpResponse = httpClient.execute(httpPost);
        HttpEntity httpEntity = httpResponse.getEntity();
        is = httpEntity.getContent();

    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    } catch (ClientProtocolException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

    try {
        BufferedReader reader = new BufferedReader(new InputStreamReader(
                is, "iso-8859-1"), 8);
        StringBuilder sb = new StringBuilder();
        String line = null;
        while ((line = reader.readLine()) != null) {
            sb.append(line + "n");
        }
        is.close();
        json = sb.toString();
       // Log.e("JSON", json);
    } catch (Exception e) {
        Log.e("Buffer Error", "Error converting result " + e.toString());
    }

    // try parse the string to a JSON object
    try {
        jObj = new JSONObject(json);           
    } catch (JSONException e) {
        Log.e("JSON Parser", "Error parsing data " + e.toString());
    }

    // return JSON String
    return jObj;

}

}

My AndroidManifest also includes:
<uses-permission android:name="android.permission.INTERNET" />.

Below is my error:

08-02 04:39:23.410: D/(2642): HostConnection::get() New Host Connection established 0xb97a3b90, tid 2642
08-02 04:39:23.480: W/EGL_emulation(2642): eglSurfaceAttrib not implemented
08-02 04:39:23.480: D/OpenGLRenderer(2642): Enabling debug mode 0
08-02 04:39:29.150: W/EGL_emulation(2642): eglSurfaceAttrib not implemented
08-02 04:39:33.650: D/InputEventConsistencyVerifier(2642): KeyEvent: ACTION_UP but key was not down.
08-02 04:39:33.650: D/InputEventConsistencyVerifier(2642):   in android.widget.EditText{b1fa92d8 VFED..CL .F...... 0,82-240,118 #7f07001c app:id/inputpassword}
08-02 04:39:33.650: D/InputEventConsistencyVerifier(2642):   0: sent at 7133734000000, KeyEvent { action=ACTION_UP, keyCode=KEYCODE_TAB, scanCode=15, metaState=0, flags=0x8, repeatCount=0, eventTime=7133734, downTime=7133655, deviceId=0, source=0x101 }
08-02 04:39:38.231: D/dalvikvm(2642): GC_FOR_ALLOC freed 177K, 8% free 2964K/3192K, paused 21ms, total 24ms
08-02 04:39:38.321: D/AndroidRuntime(2642): Shutting down VM
08-02 04:39:38.321: W/dalvikvm(2642): threadid=1: thread exiting with uncaught exception (group=0xb1cd3b20)
08-02 04:39:38.331: E/AndroidRuntime(2642): FATAL EXCEPTION: main
08-02 04:39:38.331: E/AndroidRuntime(2642): Process: com.finecalc.ltafinecalculator, PID: 2642
08-02 04:39:38.331: E/AndroidRuntime(2642): android.os.NetworkOnMainThreadException
08-02 04:39:38.331: E/AndroidRuntime(2642):     at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1145)
08-02 04:39:38.331: E/AndroidRuntime(2642):     at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:84)
08-02 04:39:38.331: E/AndroidRuntime(2642):     at libcore.io.IoBridge.connectErrno(IoBridge.java:127)
08-02 04:39:38.331: E/AndroidRuntime(2642):     at libcore.io.IoBridge.connect(IoBridge.java:112)
08-02 04:39:38.331: E/AndroidRuntime(2642):     at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192)
08-02 04:39:38.331: E/AndroidRuntime(2642):     at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:459)
08-02 04:39:38.331: E/AndroidRuntime(2642):     at java.net.Socket.connect(Socket.java:843)
08-02 04:39:38.331: E/AndroidRuntime(2642):     at org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:119)
08-02 04:39:38.331: E/AndroidRuntime(2642):     at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:144)
08-02 04:39:38.331: E/AndroidRuntime(2642):     at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
08-02 04:39:38.331: E/AndroidRuntime(2642):     at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
08-02 04:39:38.331: E/AndroidRuntime(2642):     at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
08-02 04:39:38.331: E/AndroidRuntime(2642):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
08-02 04:39:38.331: E/AndroidRuntime(2642):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
08-02 04:39:38.331: E/AndroidRuntime(2642):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
08-02 04:39:38.331: E/AndroidRuntime(2642):     at com.finecalc.library.JSONParser.getJSONFromUrl(JSONParser.java:41)
08-02 04:39:38.331: E/AndroidRuntime(2642):     at com.finecalc.library.UserFunctions.loginUser(UserFunctions.java:42)
08-02 04:39:38.331: E/AndroidRuntime(2642):     at com.finecalc.ltafinecalculator.UserLogin$1.onClick(UserLogin.java:57)
08-02 04:39:38.331: E/AndroidRuntime(2642):     at android.view.View.performClick(View.java:4438)
08-02 04:39:38.331: E/AndroidRuntime(2642):     at android.view.View$PerformClick.run(View.java:18422)
08-02 04:39:38.331: E/AndroidRuntime(2642):     at android.os.Handler.handleCallback(Handler.java:733)
08-02 04:39:38.331: E/AndroidRuntime(2642):     at android.os.Handler.dispatchMessage(Handler.java:95)
08-02 04:39:38.331: E/AndroidRuntime(2642):     at android.os.Looper.loop(Looper.java:136)
08-02 04:39:38.331: E/AndroidRuntime(2642):     at android.app.ActivityThread.main(ActivityThread.java:5017)
08-02 04:39:38.331: E/AndroidRuntime(2642):     at java.lang.reflect.Method.invokeNative(Native Method)
08-02 04:39:38.331: E/AndroidRuntime(2642):     at java.lang.reflect.Method.invoke(Method.java:515)
08-02 04:39:38.331: E/AndroidRuntime(2642):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
08-02 04:39:38.331: E/AndroidRuntime(2642):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
08-02 04:39:38.331: E/AndroidRuntime(2642):     at dalvik.system.NativeStart.main(Native Method)
08-02 04:39:41.111: D/(2670): HostConnection::get() New Host Connection established 0xb97a3cc0, tid 2670
08-02 04:39:41.181: W/EGL_emulation(2670): eglSurfaceAttrib not implemented
08-02 04:39:41.181: D/OpenGLRenderer(2670): Enabling debug mode 0
08-02 04:39:45.771: W/EGL_emulation(2670): eglSurfaceAttrib not implemented
08-02 04:39:48.371: W/EGL_emulation(2670): eglSurfaceAttrib not implemented
08-02 04:39:50.971: D/dalvikvm(2670): GC_FOR_ALLOC freed 123K, 6% free 3018K/3192K, paused 28ms, total 32ms
08-02 04:39:51.581: W/EGL_emulation(2670): eglSurfaceAttrib not implemented
08-02 04:39:51.811: D/dalvikvm(2670): GC_FOR_ALLOC freed 152K, 6% free 3380K/3584K, paused 22ms, total 31ms
08-02 04:40:18.351: W/EGL_emulation(2670): eglSurfaceAttrib not implemented
08-02 04:40:21.741: W/EGL_emulation(2670): eglSurfaceAttrib not implemented
08-02 04:40:23.021: D/AndroidRuntime(2670): Shutting down VM
08-02 04:40:23.021: W/dalvikvm(2670): threadid=1: thread exiting with uncaught exception (group=0xb1cd3b20)
08-02 04:40:23.031: E/AndroidRuntime(2670): FATAL EXCEPTION: main
08-02 04:40:23.031: E/AndroidRuntime(2670): Process: com.finecalc.ltafinecalculator, PID: 2670
08-02 04:40:23.031: E/AndroidRuntime(2670): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.finecalc.ltafinecalculator/com.finecalc.ltafinecalculator.UserRegister}: java.lang.NullPointerException
08-02 04:40:23.031: E/AndroidRuntime(2670):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2195)
08-02 04:40:23.031: E/AndroidRuntime(2670):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
08-02 04:40:23.031: E/AndroidRuntime(2670):     at android.app.ActivityThread.access$800(ActivityThread.java:135)
08-02 04:40:23.031: E/AndroidRuntime(2670):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
08-02 04:40:23.031: E/AndroidRuntime(2670):     at android.os.Handler.dispatchMessage(Handler.java:102)
08-02 04:40:23.031: E/AndroidRuntime(2670):     at android.os.Looper.loop(Looper.java:136)
08-02 04:40:23.031: E/AndroidRuntime(2670):     at android.app.ActivityThread.main(ActivityThread.java:5017)
08-02 04:40:23.031: E/AndroidRuntime(2670):     at java.lang.reflect.Method.invokeNative(Native Method)
08-02 04:40:23.031: E/AndroidRuntime(2670):     at java.lang.reflect.Method.invoke(Method.java:515)
08-02 04:40:23.031: E/AndroidRuntime(2670):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
08-02 04:40:23.031: E/AndroidRuntime(2670):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
08-02 04:40:23.031: E/AndroidRuntime(2670):     at dalvik.system.NativeStart.main(Native Method)
08-02 04:40:23.031: E/AndroidRuntime(2670): Caused by: java.lang.NullPointerException
08-02 04:40:23.031: E/AndroidRuntime(2670):     at com.finecalc.ltafinecalculator.UserRegister.onCreate(UserRegister.java:26)
08-02 04:40:23.031: E/AndroidRuntime(2670):     at android.app.Activity.performCreate(Activity.java:5231)
08-02 04:40:23.031: E/AndroidRuntime(2670):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
08-02 04:40:23.031: E/AndroidRuntime(2670):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159)
08-02 04:40:23.031: E/AndroidRuntime(2670):     ... 11 more

解决方案

This exception is thrown when application attempts to perform a networking operation in the main thread. Use below code in your onViewCreated to avoid this error else Call your networking operations (getting data from web server) request in thread or Asynch class.

public void onViewCreated(View view, Bundle savedInstanceState) 
{
    int SDK_INT = android.os.Build.VERSION.SDK_INT;
    if (SDK_INT > 8) 
    {
        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()
                .permitAll().build();
        StrictMode.setThreadPolicy(policy);
        //your codes here

    }
}

这篇关于android.os.NetworkOnMainThreadException在android.os.StrictMode $ AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1145)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆