问题描述
今天编一个安卓的小程序,就是和SOCKET通信,编出来以后我在2.3的模拟器上运行正常,可以通信,但是放到手机(4.0.3系统)上刚打开就强制跳出,我又试了一下4.0.3的模拟器,同样强制跳出,麻烦帮我看看我这个小程序,还有就是最好能说明一下4.0.3下编程的注意事项。客户端(安卓)程序packagecom.example.test;importjava.io.BufferedReader;importjava.io.BufferedWriter;importjava.io.IOException;importjava.io.InputStreamReader;importjava.io.OutputStreamWriter;importjava.io.PrintWriter;importjava.net.Socket;importandroid.app.Activity;importandroid.app.AlertDialog;importandroid.content.DialogInterface;importandroid.os.Bundle;importandroid.os.Handler;importandroid.os.Message;importandroid.view.View;importandroid.widget.Button;importandroid.widget.EditText;importandroid.widget.TextView;publicclassSocketDemoextendsActivityimplementsRunnable{privateTextViewtv_msg=null;privateEditTexted_msg=null;privateButtonbtn_send=null;//privateButtonbtn_login=null;privatestaticfinalStringHOST="192.168.49.1";privatestaticfinalintPORT=9999;privateSocketsocket=null;privateBufferedReaderin=null;privatePrintWriterout=null;privateStringcontent="";/**Calledwhentheactivityisfirstcreated.*/@OverridepublicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);tv_msg=(TextView)findViewById(R.id.TextView);ed_msg=(EditText)findViewById(R.id.EditText01);//btn_login=(Button)findViewById(R.id.Button01);btn_send=(Button)findViewById(R.id.Button02);try{socket=newSocket(HOST,PORT);in=newBufferedReader(newInputStreamReader(socket.getInputStream()));out=newPrintWriter(newBufferedWriter(newOutputStreamWriter(socket.getOutputStream())),true);}catch(IOExceptionex){ex.printStackTrace();ShowDialog("loginexception"+ex.getMessage());}btn_send.setOnClickListener(newButton.OnClickListener(){publicvoidonClick(Viewv){//TODOAuto-generatedmethodstubStringmsg=ed_msg.getText().toString();if(socket.isConnected()){if(!socket.isOutputShutdown()){out.println(msg);}}}});newThread(SocketDemo.this).start();}publicvoidShowDialog(Stringmsg){newAlertDialog.Builder(this).setTitle("notification").setMessage(msg).setPositiveButton("ok",newDialogInterface.OnClickListener(){publicvoidonClick(DialogInterfacedialog,intwhich){//TODOAuto-generatedmethodstub}}).show();}publicvoidrun(){try{while(true){if(socket.isConnected()){if(!socket.isInputShutdown()){if((content=in.readLine())!=null){content+="n";mHandler.sendMessage(mHandler.obtainMessage());}else{}}}}}catch(Exceptione){e.printStackTrace();}}publicHandlermHandler=newHandler(){publicvoidhandleMessage(Messagemsg){super.handleMessage(msg);tv_msg.setText(tv_msg.getText().toString()+content);}};}
manifest:<manifestxmlns:android="http://schemas.android.com/apk/res/android"package="com.example.test"android:versionCode="1"android:versionName="1.0"><uses-sdkandroid:minSdkVersion="15"android:targetSdkVersion="15"/><uses-permissionandroid:name="android.permission.INTERNET"></uses-permission><applicationandroid:icon="@drawable/ic_launcher"android:label="@string/app_name"android:theme="@style/AppTheme"><activityandroid:name=".SocketDemo"android:label="@string/title_activity_main"><intent-filter><actionandroid:name="android.intent.action.MAIN"/><categoryandroid:name="android.intent.category.LAUNCHER"/></intent-filter></activity></application></manifest>
解决方案
解决方案二:
这没有错误信息怎么搞
解决方案三:
我也是同样遇到了这个问题,求大神求解
解决方案四:
到AndroidManifest.Xml改<uses-sdkandroid:minSdkVersion="7"/>
解决方案五:
3.0以上Socket的使用必须放在线程中完成
解决方案六:
在安卓4.0以上版本中,socket不能再主进程上创建,必须开线程。不过我也是刚知道,正在解决中~~
解决方案七:
这儿也能问安卓的了
解决方案八:
三楼的办法可行,在OnCreate()中加入以下代码,防止中断抛出StrictMode.setThreadPolicy(newStrictMode.ThreadPolicy.Builder().detectDiskWrites().detectDiskReads().detectNetwork().penaltyLog().build());StrictMode.setVmPolicy(newStrictMode.VmPolicy.Builder().detectLeakedSqlLiteObjects().detectLeakedClosableObjects().penaltyLog().penaltyDeath().build());
解决方案九:
顶7楼!比用线程做来的方便
解决方案十:
android4.0以后就不能在主线程中初始化sockettry{socket=newSocket(HOST,PORT);in=newBufferedReader(newInputStreamReader(socket.getInputStream()));out=newPrintWriter(newBufferedWriter(newOutputStreamWriter(socket.getOutputStream())),true);}catch(IOExceptionex){ex.printStackTrace();ShowDialog("loginexception"+ex.getMessage());}把这行代码放在run里面!!