通过HTTP GET验证登录信息:Android版 [英] Verifying login details via http get : Android

查看:235
本文介绍了通过HTTP GET验证登录信息:Android版的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我似乎有一个问题,通过HTTP GET验证用户登录信息:

下面是我的code:

 公共静态无效的登录信息(用户名字符串,字符串密码){
    HttpClient的HttpClient的=新DefaultHttpClient();
    // prepare请求对象
    HTTPGET HTTPGET =新HTTPGET(HTTP:// reallinkhere /登录/+ userName的
                +/+密码);    //执行请求
    HTT presponse响应;
    尝试{
        响应= httpclient.execute(HTTPGET);
        //检查响应状态
        的System.out.println(response.getStatusLine()的toString());        //获取响应实体持有
        HttpEntity实体= response.getEntity();
        //如果响应未包封的实体,也没有必要
        //担心连接释放        如果(实体!= NULL){            //一个简单的JSON响应读取
            InputStream的河道= entity.getContent();
            字符串结果= convertStreamToString(插播广告);
            Log.i(TAG,结果);            //一个简单的JSONObject创建
            JSONObject的JSON =新的JSONObject(结果);
            Log.i(TAG,<&JSONObject的GT; \\ n+ json.toString()+\\ n< / JSONObject的>);            //一个简单的JSONObject解析
            JSONArray nameArray = json.names();
            JSONArray的valarray = json.toJSONArray(nameArray);
            的for(int i = 0; I< valArray.length();我++)
            {
                Log.i(TAG,< jsonname+ I +> \\ n+ nameArray.getString(我)+\\ n< / jsonname+ I +> \\ N
                        +&下; jsonvalue+ I +> \\ N+ valArray.getString(I)+\\ N'下; / jsonvalue+ I +>中);
            }            //一个简单的JSONObject值推
            json.put(样本键,采样值);
            Log.i(TAG,<&JSONObject的GT; \\ n+ json.toString()+\\ n< / JSONObject的>);            //关闭输入流会触发连接释放
            instream.close();
        }
    }赶上(ClientProtocolException E){
        // TODO自动生成catch块
        e.printStackTrace();
    }赶上(IOException异常五){
        // TODO自动生成catch块
        e.printStackTrace();
    }赶上(JSONException E){
        // TODO自动生成catch块
        e.printStackTrace();
    }}

和这里是我的logcat错误:

  07-20 18:48:07.469:ERROR / AndroidRuntime(16013):致命异常:主要
    java.lang.IllegalStateException:无法执行活动的方法
    在android.view.View $ 1.onClick(View.java:3599)
    在android.view.View.performClick(View.java:4204)
    在android.view.View $ PerformClick.run(View.java:17355)
    在android.os.Handler.handleCallback(Handler.java:725)
    在android.os.Handler.dispatchMessage(Handler.java:92)
    在android.os.Looper.loop(Looper.java:137)
    在android.app.ActivityThread.main(ActivityThread.java:5041)
    在java.lang.reflect.Method.invokeNative(本机方法)
    在java.lang.reflect.Method.invoke(Method.java:511)
    在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:793)
    在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
    在dalvik.system.NativeStart.main(本机方法)
    java.lang.reflect.InvocationTargetException:产生的原因
    在java.lang.reflect.Method.invokeNative(本机方法)
    在java.lang.reflect.Method.invoke(Method.java:511)
    在android.view.View $ 1.onClick(View.java:3594)
    ... 11更多
    android.os.NetworkOnMainThreadException:产生的原因
    在android.os.StrictMode $ AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1117)
    在java.net.InetAddress.lookupHostByName(InetAddress.java:385)
    在java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)
    在java.net.InetAddress.getAllByName(InetAddress.java:214)
    在org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:137)
    在org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
    在org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
    在org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
    在org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
    在org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
    在org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
    在com.example.tempo.RestClient.login(RestClient.java:67)
    在com.example.tempo.MainActivity.onClickLogin(MainActivity.java:31)
    ... 14个

我知道了reallinkhere是正确的,因为工作,当我去从浏览器我得到以下链接:

  {ID:2,电子邮件:一,级别:3,第一:调试,最后:
     测试,诞生:2013年7月19日,lastlogin:二零一三年七月二十日
     十八点38分50秒,平衡:0.00}


解决方案

此异常发生时,以往我们正在尝试在UI线程尝试网络操作。

 公共类LongOperation扩展的AsyncTask<弦乐,太虚,字符串> {        @覆盖
        保护字符串doInBackground(字符串... PARAMS){
               //通话功能
                登录(用户名,密码);
                返回null;
        }        @覆盖
        保护无效onPostExecute(字符串结果){
        }        @覆盖
        在preExecute保护无效(){
        }        @覆盖
        保护无效onProgressUpdate(虚空......值){
        }
    }

如何执行任务:

 新LongOperation()执行();

不要忘了将它添加到AndroidManifest.xml文件:

 <使用许可权的android:NAME =android.permission.INTERNET对/>

另请参见下面链接的详细信息: -

<一个href=\"http://stackoverflow.com/questions/6343166/android-os-networkonmainthreadexception\">android.os.NetworkOnMainThreadException

<一个href=\"http://stackoverflow.com/questions/13136539/caused-by-android-os-networkonmainthreadexception\">Caused由:android.os.NetworkOnMainThreadException

I seem to be having a problem verifying user login details via http get:

Here is my code :

 public static void login(String userName, String password) {
    HttpClient httpclient = new DefaultHttpClient();


    // Prepare a request object
    HttpGet httpget = new HttpGet("http://reallinkhere/login/" + userName
                + "/" + password);

    // Execute the request
    HttpResponse response;
    try {
        response = httpclient.execute(httpget);
        // Examine the response status
        System.out.println(response.getStatusLine().toString());

        // Get hold of the response entity
        HttpEntity entity = response.getEntity();
        // If the response does not enclose an entity, there is no need
        // to worry about connection release

        if (entity != null) {

            // A Simple JSON Response Read
            InputStream instream = entity.getContent();
            String result= convertStreamToString(instream);
            Log.i(TAG,result);

            // A Simple JSONObject Creation
            JSONObject json=new JSONObject(result);
            Log.i(TAG,"<jsonobject>\n"+json.toString()+"\n</jsonobject>");

            // A Simple JSONObject Parsing
            JSONArray nameArray=json.names();
            JSONArray valArray=json.toJSONArray(nameArray);
            for(int i=0;i<valArray.length();i++)
            {
                Log.i(TAG,"<jsonname"+i+">\n"+nameArray.getString(i)+"\n</jsonname"+i+">\n"
                        +"<jsonvalue"+i+">\n"+valArray.getString(i)+"\n</jsonvalue"+i+">");
            }

            // A Simple JSONObject Value Pushing
            json.put("sample key", "sample value");
            Log.i(TAG,"<jsonobject>\n"+json.toString()+"\n</jsonobject>");

            // Closing the input stream will trigger connection release
            instream.close();
        }


    } catch (ClientProtocolException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (JSONException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}

and here is my logcat errors:

07-20 18:48:07.469: ERROR/AndroidRuntime(16013): FATAL EXCEPTION: main
    java.lang.IllegalStateException: Could not execute method of the activity
    at android.view.View$1.onClick(View.java:3599)
    at android.view.View.performClick(View.java:4204)
    at android.view.View$PerformClick.run(View.java:17355)
    at android.os.Handler.handleCallback(Handler.java:725)
    at android.os.Handler.dispatchMessage(Handler.java:92)
    at android.os.Looper.loop(Looper.java:137)
    at android.app.ActivityThread.main(ActivityThread.java:5041)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:511)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
    at dalvik.system.NativeStart.main(Native Method)
    Caused by: java.lang.reflect.InvocationTargetException
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:511)
    at android.view.View$1.onClick(View.java:3594)
    ... 11 more
    Caused by: android.os.NetworkOnMainThreadException
    at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1117)
    at java.net.InetAddress.lookupHostByName(InetAddress.java:385)
    at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)
    at java.net.InetAddress.getAllByName(InetAddress.java:214)
    at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:137)
    at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
    at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
    at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
    at com.example.tempo.RestClient.login(RestClient.java:67)
    at com.example.tempo.MainActivity.onClickLogin(MainActivity.java:31)
    ... 14 more

i know the "reallinkhere" is correct and working as when i go to the link from the browser i get the following :

{"id":"2","email":"a","level":"3","first":"debug","last":
     "test","birth":"2013-07-19","lastlogin":"2013-07-20
     18:38:50","balance":"0.00"} 

解决方案

This exception occur when ever we are try to attempt network operation on UI thread.

   public class LongOperation extends AsyncTask<String, Void, String> {

        @Override
        protected String doInBackground(String... params) {
               // call function 
                login(userName, password);
                return null;
        }        

        @Override
        protected void onPostExecute(String result) {             
        }

        @Override
        protected void onPreExecute() {
        }

        @Override
        protected void onProgressUpdate(Void... values) {
        }
    }

How to execute the task:

new LongOperation().execute();

Don't forget to add this to AndroidManifest.xml file:

<uses-permission android:name="android.permission.INTERNET"/>

Also see below link to more info:-

android.os.NetworkOnMainThreadException

Caused by: android.os.NetworkOnMainThreadException

这篇关于通过HTTP GET验证登录信息:Android版的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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