-1

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

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(); 
    } 
} 

其清单文件具有下列权限

<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"/> 

请任何人都可以解释我为什么会崩溃什么异常没有处理。

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

+0

android.os.NetworkOnMainThreadException –

回答

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,但它的高度不推荐,因为它会阻止用户界面,你会得到ANR次数(应用程序未响应当网络速度很慢时(或者请求“挂起” - 即使在良好的网络中也可能发生),如果发生这种情况,请求的默认超时值为AFAIK,假设您没有更改它,则为30秒)。

请看StackOverflow上关于此问题的其他问题。对此有很多有用的和更详细的答案。另外,对于将来的问题,检查您的问题是否已经在发布之前由另一个人在此提出。它会降低重复问题的数量,并且不会让您的选票减少(并且您的问题已关闭并标记为重复)。

0
at android.os.StrictMode$AndroidBlockGuardPolicy. 

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

0

UI线程中的网络请求不允许超过android 4.0。 你应该新建一个线程来完成它。

相关问题