Android:android.os.networkonmainthreadexception

时间:2013-07-18 10:00:54

标签: android

我的Android登录功能有问题,我正在使用Android设备4.1 ....当我运行我的应用程序时,它会立即终止并且控制台显示错误:

以下是我的代码:请提供建议

public class Signup extends Activity implements OnClickListener {
// IP address where to send data
String ServerIP = "192.168.1.51";   
EditText ed_employee_username,ed_employee_password;
EditText ed_new_username,ed_new_password,ed_confirm_password;
Button btn_signup,btn_cancle_signup;
String e_username,e_password,n_username,n_password,c_password,blank = "";
String start,code,end,data;
Socket client,clientSocket;
PrintWriter printwriter;
DB_Adapter database;
ServerSocket serverSocket;
InputStreamReader inputStreamReader;
BufferedReader bufferedReader;
String employee_username_padd,employee_password_padd,IMEI,msg,result,username;
Intent i;
    @Override
      // Used for Oncreate method
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_signup);
        ed_employee_username = (EditText)findViewById(R.id.ed_employee_username);
        ed_employee_password = (EditText)findViewById(R.id.ed_employee_password);
        ed_new_username = (EditText)findViewById(R.id.ed_new_username);
        ed_new_password = (EditText)findViewById(R.id.ed_new_password);
        ed_confirm_password = (EditText)findViewById(R.id.ed_confirm_password);
        database = new DB_Adapter(getApplicationContext(), "WBS", null, 1);
        btn_signup = (Button)findViewById(R.id.btn_signup);
        btn_cancle_signup = (Button)findViewById(R.id.btn_cancle_signup);

        btn_signup.setOnClickListener(this);
        btn_cancle_signup.setOnClickListener(this);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.signup, menu);
        return true;
    }

    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub
        switch (v.getId())
        {
            case R.id.btn_signup:
                e_username = ed_employee_username.getText().toString();
                e_password = ed_employee_password.getText().toString();
                n_username = ed_new_username.getText().toString();
                n_password = ed_new_password.getText().toString();
                c_password = ed_confirm_password.getText().toString();

                if(e_username.equals(blank))
                {
                    Toast.makeText(getApplicationContext(), "Please enter Employee Username", Toast.LENGTH_SHORT).show();
                }
                else if(e_password.equals(blank) || e_password.length() <6)
                {
                    ed_employee_password.setError("You must have 6 Character’s in Password");
                    return;
                }
                else if(n_username.equals(blank))
                {
                    Toast.makeText(getApplicationContext(), "Please enter New Username", Toast.LENGTH_SHORT).show();
                }
                else if(n_password.equals(blank) || n_password.length() <6)
                {
                    ed_new_password.setError("You must have 6 Character’s in Password");
                    return;
                }
                else if(c_password.equals(blank) || c_password.length() <6)
                {
                    ed_confirm_password.setError("You must have 6 Character’s in Password");
                    return;
                }
                else if(n_password.equals(c_password))
                {
                    TelephonyManager tm = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
                    IMEI = tm.getDeviceId();//imei no is captured
                    send();
                    receive();
                    if(username.equals(e_username))
                    {
                        database.signup_detail(n_username, n_password, IMEI);
                        Toast.makeText(getApplicationContext(), " New User Registered Successfully", Toast.LENGTH_SHORT).show();
                        i = new Intent(getApplicationContext(),Login.class);
                        startActivity(i);
                        finish();
                    }
                    else
                    {
                        Toast.makeText(getApplicationContext(), "User is already registered with another Mobile Device", Toast.LENGTH_SHORT).show();                    
                    }
                }
                else
                {
                    Toast.makeText(getApplicationContext(), "New Password and Confirm Password does not match", Toast.LENGTH_SHORT).show();
                }

            break;
            case R.id.btn_cancle_signup:
                i = new Intent(getApplicationContext(),Login.class);
                startActivity(i);
                finish();
            break;
        }
    }

    public void send()
    {
        Toast.makeText(getApplicationContext(), "in send...", Toast.LENGTH_SHORT).show();
        start = "@STR";
        code =  "01";
        end = "000$";
        //Padding logic 
        employee_username_padd = e_username;
        employee_password_padd = e_password;
        int fixlen= 10;
        int eidlen= e_username.length();
        int epasslen= e_password.length();

        if(fixlen>eidlen)
        {
            for(int i=0;i<(fixlen-eidlen);i++)
            {
                employee_username_padd="*"+employee_username_padd;
            }
        }
        if(fixlen>epasslen)
        {
            for(int i=0;i<(fixlen-epasslen);i++)
            {
                employee_password_padd="*"+employee_password_padd;
            }
        }

        data = start+code+employee_username_padd+employee_password_padd+IMEI+end;
        try {
            client=new Socket(ServerIP,2222);
            printwriter=new PrintWriter(client.getOutputStream(),true);
            printwriter.write(data);
            printwriter.flush();
            printwriter.close();
            //receive();
            client.close();

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

    public String receive()
    {
        try {
            //Toast.makeText(getApplicationContext(), "in receive", Toast.LENGTH_SHORT).show();
            serverSocket = new ServerSocket(1111);
            clientSocket = serverSocket.accept();
            inputStreamReader = new InputStreamReader(clientSocket.getInputStream());
            bufferedReader = new BufferedReader(inputStreamReader); //get the client message
            msg = bufferedReader.readLine();
            Toast.makeText(getApplicationContext(), msg, Toast.LENGTH_LONG).show();
            String start1= msg.substring(0,4);
            String code1= msg.substring(4, 6);
            String result1= msg.substring(6, 16);
            String end1= msg.substring(16, 20);

            if(start1.equals("@STR") && code1.equals("01") && end1.equals("999$"))
            {
                /*Toast.makeText(getApplicationContext(), start1, Toast.LENGTH_SHORT).show();
                Toast.makeText(getApplicationContext(), code1, Toast.LENGTH_SHORT).show();
                Toast.makeText(getApplicationContext(), result1, Toast.LENGTH_SHORT).show();
                Toast.makeText(getApplicationContext(), end1, Toast.LENGTH_SHORT).show();*/

                result = result1;
                remove_padding();
            }else
            {
                /*Toast.makeText(getApplicationContext(), "in else"+start1, Toast.LENGTH_SHORT).show();
                Toast.makeText(getApplicationContext(), "in else"+code1, Toast.LENGTH_SHORT).show();
                Toast.makeText(getApplicationContext(), "in else"+result1, Toast.LENGTH_SHORT).show();
                Toast.makeText(getApplicationContext(), "in else"+end1, Toast.LENGTH_SHORT).show();*/
                result = result1;
                remove_padding();
            }

        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return result;
    }
    public String remove_padding()
    {
        //String starusername=usernamepasswordIMEI.substring(0,10);

        char star='*';

                int count=0;

                    if(result.charAt(0) == star)
                    {
                        for(int i=0;i<result.length();i++)
                        {

                            if(result.charAt(i) == star)
                            {
                                count++;
                            }
                            /*break;*/
                        }//end for
                        username=result.substring(count,result.length());
                    }
                    else
                    {
                        System.out.println("user name String doesn't start with *");
                        username=result;
                    }


                    return username;

    }

运行后显示以下错误:

07-18 15:13:09.502: E/AndroidRuntime(32249): FATAL EXCEPTION: main
07-18 15:13:09.502: E/AndroidRuntime(32249): android.os.NetworkOnMainThreadException
07-18 15:13:09.502: E/AndroidRuntime(32249):    at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1117)
07-18 15:13:09.502: E/AndroidRuntime(32249):    at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:84)
07-18 15:13:09.502: E/AndroidRuntime(32249):    at libcore.io.IoBridge.connectErrno(IoBridge.java:127)
07-18 15:13:09.502: E/AndroidRuntime(32249):    at libcore.io.IoBridge.connect(IoBridge.java:112)
07-18 15:13:09.502: E/AndroidRuntime(32249):    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192)
07-18 15:13:09.502: E/AndroidRuntime(32249):    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
07-18 15:13:09.502: E/AndroidRuntime(32249):    at java.net.Socket.startupSocket(Socket.java:566)
07-18 15:13:09.502: E/AndroidRuntime(32249):    at java.net.Socket.tryAllAddresses(Socket.java:127)
07-18 15:13:09.502: E/AndroidRuntime(32249):    at java.net.Socket.<init>(Socket.java:177)
07-18 15:13:09.502: E/AndroidRuntime(32249):    at java.net.Socket.<init>(Socket.java:149)
07-18 15:13:09.502: E/AndroidRuntime(32249):    at com.ami.wbs.Signup.send(Signup.java:161)
07-18 15:13:09.502: E/AndroidRuntime(32249):    at com.ami.wbs.Signup.onClick(Signup.java:102)
07-18 15:13:09.502: E/AndroidRuntime(32249):    at android.view.View.performClick(View.java:4117)
07-18 15:13:09.502: E/AndroidRuntime(32249):    at android.view.View$PerformClick.run(View.java:17041)
07-18 15:13:09.502: E/AndroidRuntime(32249):    at android.os.Handler.handleCallback(Handler.java:615)
07-18 15:13:09.502: E/AndroidRuntime(32249):    at android.os.Handler.dispatchMessage(Handler.java:92)
07-18 15:13:09.502: E/AndroidRuntime(32249):    at android.os.Looper.loop(Looper.java:137)
07-18 15:13:09.502: E/AndroidRuntime(32249):    at android.app.ActivityThread.main(ActivityThread.java:4747)
07-18 15:13:09.502: E/AndroidRuntime(32249):    at java.lang.reflect.Method.invokeNative(Native Method)
07-18 15:13:09.502: E/AndroidRuntime(32249):    at java.lang.reflect.Method.invoke(Method.java:511)
07-18 15:13:09.502: E/AndroidRuntime(32249):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
07-18 15:13:09.502: E/AndroidRuntime(32249)`enter code here`:   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
07-18 15:13:09.502: E/AndroidRuntime(32249):    at dalvik.system.NativeStart.main(Native Method)

2 个答案:

答案 0 :(得分:0)

您无法使用主UI线程中的网络操作。要做到这一点,你必须在不同的线程中使用它们(更好地使用AsyncTask

有关详情,请查看文档here。来自doc

  

应用程序尝试执行时抛出的异常   在其主线程上进行网络操作。

     

这仅适用于针对Honeycomb SDK或。的应用程序   更高。允许使用早期SDK版本的应用程序   他们的主要事件循环线程上的网络,但它是很重要的   泄气。请参阅文档设计响应性。

     

另见StrictMode。

答案 1 :(得分:0)

  1. (最佳方式)正如其名称所示,异常在主线程中,因此应该使用单独的线程或使用asynctask
  2. (临时解决方案)在您的活动中添加此代码

     ThreadPolicy tp = ThreadPolicy.LAX;
     StrictMode.setThreadPolicy(tp);
    
  3. 因为这是Gingerbread(API)中的一个问题。您也可以将targetSDK更改为9.但这不是一个好的解决方案。