-1

我正在创建一个应用程序,它将访问并从服务器获取数据,因此应用程序可以正常工作并在 GingerBread(2.3.5) 中按预期运行,但它在 JellyBeans(4.1.2) 中崩溃。它会产生以下错误

12-19 14:46:12.027: I/System.out(10088): Domain has been set

12-19 14:46:12.082: I/System.out(10088): Created http client

12-19 14:46:12.093: I/System.out(10088): Created the httppost domain

12-19 14:46:12.097: I/System.out(10088): Response has been initalized by null

12-19 14:46:12.101: I/System.out(10088): Added the parameter  email

12-19 14:46:12.101: I/System.out(10088): Added the parameter  Password

12-19 14:46:12.136: I/System.out(10088): Setting the entity

12-19 14:46:12.218: D/AndroidRuntime(10088): Shutting down VM

12-19 14:46:12.218: W/dalvikvm(10088): threadid=1: thread exiting with uncaught   exception (group=0x40ca4300)

12-19 14:46:12.257: E/AndroidRuntime(10088): FATAL EXCEPTION: main

12-19 14:46:12.257: E/AndroidRuntime(10088): android.os.NetworkOnMainThreadException

12-19 14:46:12.257: E/AndroidRuntime(10088):    at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1117)

12-19 14:46:12.257: E/AndroidRuntime(10088):    at java.net.InetAddress.lookupHostByName(InetAddress.java:385)

12-19 14:46:12.257: E/AndroidRuntime(10088):    at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)

12-19 14:46:12.257: E/AndroidRuntime(10088):    at java.net.InetAddress.getAllByName(InetAddress.java:214)

12-19 14:46:12.257: E/AndroidRuntime(10088):    at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:137)

12-19 14:46:12.257: E/AndroidRuntime(10088):    at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)

12-19 14:46:12.257: E/AndroidRuntime(10088):    at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)

12-19 14:46:12.257: E/AndroidRuntime(10088):    at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)

12-19 14:46:12.257: E/AndroidRuntime(10088):    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)

12-19 14:46:12.257: E/AndroidRuntime(10088):    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)

12-19 14:46:12.257: E/AndroidRuntime(10088):    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)

12-19 14:46:12.257: E/AndroidRuntime(10088):    at com.yousaf.naveed.CommunicationClass.trydata(CommunicationClass.java:96)

12-19 14:46:12.257: E/AndroidRuntime(10088):    at com.yousaf.naveed.signin.senddata(signin.java:86)

12-19 14:46:12.257: E/AndroidRuntime(10088):    at com.yousaf.naveed.signin$1.onClick(signin.java:57)

12-19 14:46:12.257: E/AndroidRuntime(10088):    at android.view.View.performClick(View.java:4084)

12-19 14:46:12.257: E/AndroidRuntime(10088):    at android.view.View$PerformClick.run(View.java:16966)

12-19 14:46:12.257: E/AndroidRuntime(10088):    at android.os.Handler.handleCallback(Handler.java:615)

12-19 14:46:12.257: E/AndroidRuntime(10088):    at android.os.Handler.dispatchMessage(Handler.java:92)

12-19 14:46:12.257: E/AndroidRuntime(10088):    at android.os.Looper.loop(Looper.java:137)

12-19 14:46:12.257: E/AndroidRuntime(10088):    at android.app.ActivityThread.main(ActivityThread.java:4745)

12-19 14:46:12.257: E/AndroidRuntime(10088):    at java.lang.reflect.Method.invokeNative(Native Method)

12-19 14:46:12.257: E/AndroidRuntime(10088):    at java.lang.reflect.Method.invoke(Method.java:511)

12-19 14:46:12.257: E/AndroidRuntime(10088):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)

12-19 14:46:12.257: E/AndroidRuntime(10088):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)

12-19 14:46:12.257: E/AndroidRuntime(10088):    at dalvik.system.NativeStart.main(Native Method)

12-19 14:46:12.285: W/ActivityManager(248):   Force finishing activity com.yousaf.naveed/.signin

12-19 14:46:12.820: W/ActivityManager(248): Activity pause timeout for ActivityRecord{41479970 com.yousaf.naveed/.signin}

登录代码如下

protected void senddata() {
    int status = 0,role=0;
    int active=0;
    // TODO Auto-generated method stub
    @SuppressWarnings("unused")
    String JSONString = null;
    ccobj = new CommunicationClass();
    ccobj.setDomain("http://naveedyousaf.com/fyp/cakephp-master/cakephp-master/Users/signin");
    ccobj.setClient();
    ccobj.startpost(ccobj.Domain);
    ccobj.setResponse();
    ccobj.insertdata("email", email);
    ccobj.insertdata("Password", password);
    ccobj.trydata();
    ccobj.setreader();
    ccobj.setStringBuilder();   
    ccobj.readresponse();
    JSONString = new String(ccobj.builder);

        String first_name = null,last_name = null,emails=null,password=null,emer=null; 
        try {
            status = ccobj.finalResult.getInt("status");
            first_name = ccobj.finalResult.getString("First_Name");
            last_name = ccobj.finalResult.getString("Last_Name");
            emails = ccobj.finalResult.getString("Email");
            password = ccobj.finalResult.getString("Password");
            role =   ccobj.finalResult.getInt("Role");
            //active = ccobj.finalResult.getInt("Active");
            ids = ccobj.finalResult.getInt("Id");
            System.out.print("============="+ids);
            emer = ccobj.finalResult.getString("Emergency");

        } catch (JSONException e) {
            // TODO Auto-generated catch block
            System.out.println("In the issue itself");
            e.printStackTrace();
        }
        error=(TextView) this.findViewById(R.id.error);
        System.out.println(status);
        if(status==2){
            try{
                error.setTextColor(Color.RED);
                error.setText("Unrecognized Email");
                error.setTextSize(12);
                fpass.setTextColor(Color.RED);
                fpass.setTextSize(12);
                //pd.cancel();
            }
            catch(NullPointerException e){
                System.out.println("This is the uncaught exception");
            }

            //error.text.setTextColor(Color.rgb(200,0,0));
        }
        if(status==1){
            dcobj = new DataClass();
            //ids = Integer.parseInt(id);
            dcobj.setFirstName(first_name);
            dcobj.setLastName(last_name);
            dcobj.setEmail(emails);
            dcobj.setPassword(password);
            dcobj.setRole(role);
            dcobj.setStatus(status);
            dcobj.setActive(active);
            dcobj.setId(ids);
            dcobj.setEmer(emer);
            sendnewdata();
        }

}

通信类的代码如下

public void setreader(){
    try {
        reader = new BufferedReader(new InputStreamReader(this.response.getEntity().getContent(), "UTF-8"));
        System.out.println("Setting the contents of the Reader");
    } catch (UnsupportedEncodingException e) {
        // TODO Auto-generated catch block
        System.out.println("In the UnsupportedEncodingException catch of the Reader");
        e.printStackTrace();
    } catch (IllegalStateException e) {
        // TODO Auto-generated catch block
        System.out.println("In the IllegalStateException catch of the Reader");
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        System.out.println("In the IOException catch of the Reader");
        e.printStackTrace();
    }

}
public void startpost(String str){
    datapost=new HttpPost(str);
    System.out.println("Created the httppost domain");
}
public void insertdata(String tag,String value){
    namevaluepairs.add(new BasicNameValuePair(tag,value));
    System.out.println("Added the parameter  "+tag);
}

public void trydata(){
    try {
        this.datapost.setEntity(new UrlEncodedFormEntity(this.namevaluepairs));
        System.out.println("Setting the entity");

        try {
            //HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection);
            this.response = this.client.execute(this.datapost);
            System.out.println("executing the client");
             if(this.response != null){
                 System.out.println("i am in if of this.response!=null");
             }
             else{
                 System.out.println("i am in else of this.response!=null");
             }
             System.out.println("in response try box");
        } catch (ClientProtocolException e) {
            // TODO Auto-generated catch block
            System.out.println("in ClientProtocolException Catch box");
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            System.out.println("in IOException Catch box");
            e.printStackTrace();
        }
    } catch (UnsupportedEncodingException e) {
        // TODO Auto-generated catch block
        System.out.println("in UnSupported Catch box");
        e.printStackTrace();
    }
}
public void readresponse(){     



    try {
        for (String line = null; (line = reader.readLine()) != null;) {
            builder.append(line).append("\n");

        }
        System.out.println(this.builder);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
     tokener = new JSONTokener(builder.toString());
    try {
         finalResult = new JSONObject(tokener);
        System.out.println("I am in try block of json final result reading");
    } catch (JSONException e) {
        // TODO Auto-generated catch block
        System.out.println("I catch block of jsonException");
        e.printStackTrace();
    } 
}

其 Manifest 文件具有以下权限

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

请任何人都可以解释一下为什么它会崩溃未处理的异常。

我有登录的主要活动,但是这个登录类正在调用正在使用 post 方法执行 httpclient 协议的 CommunicationClass 登录不执行 httpclient 本身,但它正在等待执行,所以为什么我确实需要异步任务。

4

3 回答 3

2

在后台线程上执行网络操作或禁用StrictMode

不要senddata像现在这样调用(我不知道你从哪个函数调用它,但该函数在 UI 线程上运行),尝试AsyncTask像这样调用它:

  someFunctionOnTheUIThread()
  {
    //senddata(); //this is your current senddata() call. Replace it with the following

    (new AsyncTask<Void, Void, Void>() {

        @Override
        protected Void doInBackground(Void... params) {
            senddata();
            return null;
        }
    }).execute((Void)null);
  }

如开头所述,您也可以禁用StrictMode,但非常不建议这样做,因为它会阻塞 UI,当网络速度较慢(或请求“挂起”)时,您会收到 ANR(应用程序无响应) - 它甚至可能发生在良好的网络上,如果是这样,请求的默认超时是 AFAIK 并假设您没有更改它,30 秒)。

请查看 StackOverflow 上有关此问题的其他问题。对此有很多有用且更详细的答案。另外,对于以后的问题,在发布之前检查您的问题是否已经被其他人在这里提出过。它会减少重复问题的数量,并且不会让您被否决(并且您的问题已关闭并标记为重复问题)。

于 2013-12-19T10:07:30.543 回答
0
at android.os.StrictMode$AndroidBlockGuardPolicy.

您启用了严格模式。禁用它或尝试在单独的线程中执行网络操作。

于 2013-12-19T10:11:31.030 回答
0

android 4.0 以上不允许 UI 线程中的网络请求。您应该新建一个线程来执行此操作。

于 2013-12-19T11:16:08.687 回答