在Android的致命异常 [英] fatal exception in android

查看:131
本文介绍了在Android的致命异常的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经写了简单的客户端服务器套接字编程code作为遵循

MyServer.java

 进口java.io.DataInputStream中;
 进口java.io.DataOutputStream中;
 进口java.io.IOException异常;
 进口java.net.ServerSocket的;
 进口的java.net.Socket;
 公共类要播{   公共静态无效的主要(字串[] args){
   ServerSocket的ServerSocket的= NULL;
   Socket套接字= NULL;
   DataInputStream以DataInputStream以= NULL;
   DataOutputStream类DataOutputStream类= NULL;    尝试{
         ServerSocket的=新的ServerSocket(8888);
         的System.out.println(听:8888);
        }赶上(IOException异常五){
    // TODO自动生成catch块
    e.printStackTrace();
   }   而(真){
    尝试{
    插座=的ServerSocket.accept();
    DataInputStream以=新DataInputStream所(socket.getInputStream());
    DataOutputStream类=新的DataOutputStream类(socket.getOutputStream());
    的System.out.println(IP:+ socket.getInetAddress());
    的System.out.println(消息:+ dataInputStream.readUTF());
    dataOutputStream.writeUTF(你好!);
    }赶上(IOException异常五){
    // TODO自动生成catch块
    e.printStackTrace();
   }
   最后{
   如果(插座!= NULL){
 尝试{
  socket.close();
 }赶上(IOException异常五){
  // TODO自动生成catch块
  e.printStackTrace();
 }
}如果(DataInputStream以!= NULL){
 尝试{
  dataInputStream.close();
 }赶上(IOException异常五){
  // TODO自动生成catch块
  e.printStackTrace();
 }
}如果(DataOutputStream类!= NULL){
 尝试{
  dataOutputStream.close();
 }赶上(IOException异常五){
  // TODO自动生成catch块
  e.printStackTrace();
    }
   }
  }
 }
 }}

Android客户端如下:

MyClientActivity.java

 包com.exercise.AndroidClient;进口java.io.DataInputStream中;
进口java.io.DataOutputStream中;
进口java.io.IOException异常;
进口的java.net.Socket;
进口的java.net.UnknownHostException;进口android.app.Activity;
进口android.os.Bundle;
进口android.view.View;
进口android.widget.Button;
进口android.widget.EditText;
进口android.widget.TextView;
进口android.os.Bundle;公共类MyClientActivity延伸活动{
EditText上的TextOut;
TextView的textIn; / **当第一次创建活动调用。 * /
 @覆盖
 公共无效的onCreate(捆绑savedInstanceState){
     super.onCreate(savedInstanceState);
     的setContentView(R.layout.main);     的TextOut =(EditText上)findViewById(R.id.textout);
     按钮buttonSend =(按钮)findViewById(R.id.send);
     textIn =(的TextView)findViewById(R.id.textin);
     buttonSend.setOnClickListener(buttonSendOnClickListener);
 } Button.OnClickListener buttonSendOnClickListener
 =新Button.OnClickListener(){@覆盖
公共无效的onClick(查看为arg0){
 // TODO自动生成方法存根
 Socket套接字= NULL;
 DataOutputStream类DataOutputStream类= NULL;
 DataInputStream以DataInputStream以= NULL; 尝试{
  插座=新的Socket(113.193.42.220,8888);
  DataOutputStream类=新的DataOutputStream类(socket.getOutputStream());
  DataInputStream以=新DataInputStream所(socket.getInputStream());
  dataOutputStream.writeUTF(textOut.g​​etText()的toString());
  textIn.setText(dataInputStream.readUTF());
 }赶上(UnknownHostException异常五){
  // TODO自动生成catch块
  e.printStackTrace();
 }赶上(IOException异常五){
  // TODO自动生成catch块
  e.printStackTrace();
 }
 最后{
  如果(插座!= NULL){
   尝试{
    socket.close();
   }赶上(IOException异常五){
    // TODO自动生成catch块
    e.printStackTrace();
   }
  }  如果(DataOutputStream类!= NULL){
   尝试{
    dataOutputStream.close();
   }赶上(IOException异常五){
    // TODO自动生成catch块
    e.printStackTrace();
   }
  }  如果(DataInputStream以!= NULL){
   尝试{
    dataInputStream.close();
   }赶上(IOException异常五){
    // TODO自动生成catch块
    e.printStackTrace();
   }
  }
 }
}};
 }

main.xml中

 <?XML版本=1.0编码=UTF-8&GT?;
 < LinearLayout中的xmlns:机器人=htt​​p://schemas.android.com/apk/res/android
 机器人:方向=垂直
 机器人:layout_width =FILL_PARENT
 机器人:layout_height =FILL_PARENT
 >
 <的TextView
 机器人:layout_width =FILL_PARENT
 机器人:layout_height =WRAP_CONTENT
 机器人:文字=@字符串/你好
 />
 <的EditText
 机器人:ID =@ + ID /的TextOut
 机器人:layout_width =FILL_PARENT
 机器人:layout_height =WRAP_CONTENT
 />
 <按钮
 机器人:ID =@ + ID /发送
 机器人:layout_width =FILL_PARENT
 机器人:layout_height =WRAP_CONTENT
 机器人:文字=发送
 />
 <的TextView
 机器人:ID =@ + ID / textin
 机器人:layout_width =FILL_PARENT
 机器人:layout_height =WRAP_CONTENT
 />
 < / LinearLayout中>

AndroidManifest.xml中

 <?XML版本=1.0编码=UTF-8&GT?;
<清单的xmlns:机器人=htt​​p://schemas.android.com/apk/res/android
包=com.exercise.AndroidClient
安卓版code =1
机器人:=的versionName1.0>
<使用许可权的android:NAME =android.permission.INTERNET对/><采用-SDK安卓的minSdkVersion =15/><应用
    机器人:图标=@绘制/ ic_launcher
    机器人:标签=@字符串/ APP_NAME>
    <活动
        机器人:MyClientActivityNAME =
        机器人:标签=@字符串/ APP_NAME>
        &所述;意图滤光器>
            <作用机器人:名字=android.intent.action.MAIN/>            <类机器人:名字=android.intent.category.LAUNCHER/>
        &所述; /意图滤光器>
    < /活性GT;
< /用途>< /清单>

我收到FatalException上client.pls执行建议我如何处理这个问题。
我已经尽了PC的IP地址和127.0.0.1还这么我有IP地址或其他任何问题导致FatalException请帮助我。

logcat的是如下

  02-21 21:05:48.793:D / gralloc_goldfish(553):没有模拟器检测GPU的仿真。
02-21 21:08:39.794:D / AndroidRuntime(553):关闭VM
02-21 21:08:39.794:W / dalvikvm(553):主题ID = 1:螺纹未捕获的异常(组= 0x409c01f8)退出
02-21 21:08:39.824:E / AndroidRuntime(553):致命异常:主要
02-21 21:08:39.824:E / AndroidRuntime(553):android.os.NetworkOnMainThreadException
02-21 21:08:39.824:E / AndroidRuntime(553):在android.os.StrictMode $ AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1099)
02-21 21:08:39.824:E / AndroidRuntime(553):在libcore.io.BlockGuardOs.connect(BlockGuardOs.java:84)
02-21 21:08:39.824:E / AndroidRuntime(553):在libcore.io.IoBridge.connectErrno(IoBridge.java:127)
02-21 21:08:39.824:E / AndroidRuntime(553):在libcore.io.IoBridge.connect(IoBridge.java:112)
02-21 21:08:39.824:E / AndroidRuntime(553):在java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192)
02-21 21:08:39.824:E / AndroidRuntime(553):在java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
02-21 21:08:39.824:E / AndroidRuntime(553):在java.net.Socket.startupSocket(Socket.java:566)
02-21 21:08:39.824:E / AndroidRuntime(553):在java.net.Socket.tryAllAddresses(Socket.java:127)
02-21 21:08:39.824:E / AndroidRuntime(553):在java.net.Socket中的<&初始化GT;(Socket.java:177)
02-21 21:08:39.824:E / AndroidRuntime(553):在java.net.Socket中的<&初始化GT;(Socket.java:149)
02-21 21:08:39.824:E / AndroidRuntime(553):在com.exercise.AndroidClient.MyClientActivity $ 1.onClick(MyClientActivity.java:44)
02-21 21:08:39.824:E / AndroidRuntime(553):在android.view.View.performClick(View.java:3511)
02-21 21:08:39.824:E / AndroidRuntime(553):在android.view.View $ PerformClick.run(View.java:14105)
02-21 21:08:39.824:E / AndroidRuntime(553):在android.os.Handler.handleCallback(Handler.java:605)
02-21 21:08:39.824:E / AndroidRuntime(553):在android.os.Handler.dispatchMessage(Handler.java:92)
02-21 21:08:39.824:E / AndroidRuntime(553):在android.os.Looper.loop(Looper.java:137)
02-21 21:08:39.824:E / AndroidRuntime(553):在android.app.ActivityThread.main(ActivityThread.java:4424)
02-21 21:08:39.824:E / AndroidRuntime(553):在java.lang.reflect.Method.invokeNative(本机方法)
02-21 21:08:39.824:E / AndroidRuntime(553):在java.lang.reflect.Method.invoke(Method.java:511)
02-21 21:08:39.824:E / AndroidRuntime(553):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:784)
02-21 21:08:39.824:E / AndroidRuntime(553):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
02-21 21:08:39.824:E / AndroidRuntime(553):在dalvik.system.NativeStart.main(本机方法)


解决方案

您是在主应用程序线程acessing网络。这不是在Android的3+允许的。您需要启动单独的线程做接入网络。

您可以使用的AsyncTask 来分隔code,这是acessing网络,另一个

i have written simple client server socket programming code as follow

MyServer.java

 import java.io.DataInputStream;
 import java.io.DataOutputStream;
 import java.io.IOException;
 import java.net.ServerSocket;
 import java.net.Socket;


 public class MyServer {

   public static void main(String[] args){
   ServerSocket serverSocket = null;
   Socket socket = null;
   DataInputStream dataInputStream = null;
   DataOutputStream dataOutputStream = null;

    try {
         serverSocket = new ServerSocket(8888);
         System.out.println("Listening :8888");
        } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }

   while(true){
    try {
    socket = serverSocket.accept();
    dataInputStream = new DataInputStream(socket.getInputStream());
    dataOutputStream = new DataOutputStream(socket.getOutputStream());
    System.out.println("ip: " + socket.getInetAddress());
    System.out.println("message: " + dataInputStream.readUTF());
    dataOutputStream.writeUTF("Hello!");
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
   finally{
   if( socket!= null){
 try {
  socket.close();
 } catch (IOException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
 }
}

if( dataInputStream!= null){
 try {
  dataInputStream.close();
 } catch (IOException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
 }
}

if( dataOutputStream!= null){
 try {
  dataOutputStream.close();
 } catch (IOException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
    }
   }
  }
 }
 }}

android client is as follows

MyClientActivity.java

package com.exercise.AndroidClient;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.os.Bundle;

public class MyClientActivity extends Activity {
EditText textOut;
TextView textIn;

 /** Called when the activity is first created. */
 @Override
 public void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     setContentView(R.layout.main);

     textOut = (EditText)findViewById(R.id.textout);
     Button buttonSend = (Button)findViewById(R.id.send);
     textIn = (TextView)findViewById(R.id.textin);
     buttonSend.setOnClickListener(buttonSendOnClickListener);
 }

 Button.OnClickListener buttonSendOnClickListener
 = new Button.OnClickListener(){

@Override
public void onClick(View arg0) {
 // TODO Auto-generated method stub
 Socket socket = null;
 DataOutputStream dataOutputStream = null;
 DataInputStream dataInputStream = null;

 try {
  socket = new Socket("113.193.42.220", 8888);
  dataOutputStream = new DataOutputStream(socket.getOutputStream());
  dataInputStream = new DataInputStream(socket.getInputStream());
  dataOutputStream.writeUTF(textOut.getText().toString());
  textIn.setText(dataInputStream.readUTF());
 } catch (UnknownHostException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
 } catch (IOException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
 }
 finally{
  if (socket != null){
   try {
    socket.close();
   } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
  }

  if (dataOutputStream != null){
   try {
    dataOutputStream.close();
   } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
  }

  if (dataInputStream != null){
   try {
    dataInputStream.close();
   } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
  }
 }
}};
 }

Main.xml

 <?xml version="1.0" encoding="utf-8"?>
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:orientation="vertical"
 android:layout_width="fill_parent"
 android:layout_height="fill_parent"
 >
 <TextView
 android:layout_width="fill_parent"
 android:layout_height="wrap_content"
 android:text="@string/hello"
 />
 <EditText
 android:id="@+id/textout"
 android:layout_width="fill_parent"
 android:layout_height="wrap_content"
 />
 <Button
 android:id="@+id/send"
 android:layout_width="fill_parent"
 android:layout_height="wrap_content"
 android:text="Send"
 />
 <TextView
 android:id="@+id/textin"
 android:layout_width="fill_parent"
 android:layout_height="wrap_content"
 />
 </LinearLayout>

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.exercise.AndroidClient"
android:versionCode="1"
android:versionName="1.0" >
<uses-permission android:name="android.permission.INTERNET"/>

<uses-sdk android:minSdkVersion="15" />

<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name" >
    <activity
        android:name=".MyClientActivity"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

</manifest>

I am getting FatalException on execution of client.pls suggest me how to handle this. i have tried my pc's ip address and 127.0.0.1 also so do i have any problem with ip address or anything else is causing FatalException pls help me out.

logcat is as follow

02-21 21:05:48.793: D/gralloc_goldfish(553): Emulator without GPU emulation detected.
02-21 21:08:39.794: D/AndroidRuntime(553): Shutting down VM
02-21 21:08:39.794: W/dalvikvm(553): threadid=1: thread exiting with uncaught exception (group=0x409c01f8)
02-21 21:08:39.824: E/AndroidRuntime(553): FATAL EXCEPTION: main
02-21 21:08:39.824: E/AndroidRuntime(553): android.os.NetworkOnMainThreadException
02-21 21:08:39.824: E/AndroidRuntime(553):  at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1099)
02-21 21:08:39.824: E/AndroidRuntime(553):  at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:84)
02-21 21:08:39.824: E/AndroidRuntime(553):  at libcore.io.IoBridge.connectErrno(IoBridge.java:127)
02-21 21:08:39.824: E/AndroidRuntime(553):  at libcore.io.IoBridge.connect(IoBridge.java:112)
02-21 21:08:39.824: E/AndroidRuntime(553):  at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192)
02-21 21:08:39.824: E/AndroidRuntime(553):  at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
02-21 21:08:39.824: E/AndroidRuntime(553):  at java.net.Socket.startupSocket(Socket.java:566)
02-21 21:08:39.824: E/AndroidRuntime(553):  at java.net.Socket.tryAllAddresses(Socket.java:127)
02-21 21:08:39.824: E/AndroidRuntime(553):  at java.net.Socket.<init>(Socket.java:177)
02-21 21:08:39.824: E/AndroidRuntime(553):  at java.net.Socket.<init>(Socket.java:149)
02-21 21:08:39.824: E/AndroidRuntime(553):  at com.exercise.AndroidClient.MyClientActivity$1.onClick(MyClientActivity.java:44)
02-21 21:08:39.824: E/AndroidRuntime(553):  at android.view.View.performClick(View.java:3511)
02-21 21:08:39.824: E/AndroidRuntime(553):  at android.view.View$PerformClick.run(View.java:14105)
02-21 21:08:39.824: E/AndroidRuntime(553):  at android.os.Handler.handleCallback(Handler.java:605)
02-21 21:08:39.824: E/AndroidRuntime(553):  at android.os.Handler.dispatchMessage(Handler.java:92)
02-21 21:08:39.824: E/AndroidRuntime(553):  at android.os.Looper.loop(Looper.java:137)
02-21 21:08:39.824: E/AndroidRuntime(553):  at android.app.ActivityThread.main(ActivityThread.java:4424)
02-21 21:08:39.824: E/AndroidRuntime(553):  at java.lang.reflect.Method.invokeNative(Native Method)
02-21 21:08:39.824: E/AndroidRuntime(553):  at java.lang.reflect.Method.invoke(Method.java:511)
02-21 21:08:39.824: E/AndroidRuntime(553):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
02-21 21:08:39.824: E/AndroidRuntime(553):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
02-21 21:08:39.824: E/AndroidRuntime(553):  at dalvik.system.NativeStart.main(Native Method)

解决方案

You are acessing network on main application thread. This is not allowed in Android 3+. You need to start separate thread do access network.

You can use AsyncTask to separate your code, which is acessing network, to another Thread.

这篇关于在Android的致命异常的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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