什么是错误?新到Android编程 [英] What is the error? New To Android Programming

查看:108
本文介绍了什么是错误?新到Android编程的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想实现一个服务器的客户端程序在Android.Can发送短信请你说我什么都在我的code中的错误,如何纠正呢?服务器运行良好,但客户端程序有一个错误。

这是服务器code,这是运行良好。

 包com.app.MyServer;
进口java.io.BufferedReader中;
进口java.io.IOException异常;
进口java.io.InputStreamReader中;
进口java.net.ServerSocket的;
进口的java.net.Socket;
进口android.app.Activity;
进口android.os.Bundle;
进口android.os.Handler;
进口android.os.Message;
进口android.util.Log;
进口android.widget.TextView;
公共类要播延伸活动{
ServerSocket的SS = NULL;
串mClientMsg =;
螺纹myCommsThread = NULL;
受保护的静态最终诠释MSG_ID = 0x1337;
公共静态最终诠释SERVERPORT = 6000;
@覆盖
公共无效的onCreate(捆绑savedInstanceState){
    super.onCreate(savedInstanceState);
    的setContentView(R.layout.main);
    TextView的电视=(的TextView)findViewById(R.id.TextView01);
    tv.setText(从客户还没有什么);
    this.myCommsThread =新主题(新CommsThread());
    this.myCommsThread.start();
}
@覆盖
保护无效的onStop(){
    super.onStop();
    尝试{
            //确保您在退出关闭套接字
            ss.close();
    }赶上(IOException异常五){
            e.printStackTrace();
    }
}
处理器myUpdateHandler =新的处理程序(){
    公共无效的handleMessage(消息MSG){
            开关(msg.what){
            案例MSG_ID:
                    TextView的电视=(的TextView)findViewById(R.id.TextView01);
                    tv.setText(mClientMsg);
                    打破;
            默认:
                    打破;
            }
            super.handleMessage(MSG);
    }
};
类CommsThread实现Runnable {
    公共无效的run(){
            插座S = NULL;
            尝试{
                    SS =新的ServerSocket(SERVERPORT);
                    Log.v(服务器,ss.toString());
            }赶上(IOException异常五){
                    e.printStackTrace();
            }
            而(!Thread.currentThread()。isInterrupted()){
                    消息m =新的Message();
                    Log.v(信息,m.toString());
                    m.what = MSG_ID;
                    尝试{
                            如果(S == NULL和放大器;&安培; SS!= NULL)
                            {
                                S = ss.accept();
                                Log.v(DRRR,这不是空);
                            }
                            其他
                                Log.v(问题是,SS为空);                            输入的BufferedReader =新的BufferedReader(新的InputStreamReader(s.getInputStream()));
                            串ST =无效;
                            ST = input.readLine();
                            mClientMsg = ST;
                            myUpdateHandler.sendMessage(米);
                    }赶上(IOException异常五){
                            Log.v(错误,e.toString());
                            e.printStackTrace();
                    }
            }
    }
}
}

客户code:

 包com.exercise.AndroidClient;
进口java.io.DataInputStream中;
进口java.io.DataOutputStream中;
进口java.io.IOException异常;
进口的java.net.Socket;
进口的java.net.UnknownHostException;进口android.app.Activity;
进口android.os.AsyncTask;
进口android.os.Bundle;
进口android.util.Log;
进口android.view.View;
进口android.widget.Button;
进口android.widget.EditText;
进口android.widget.TextView;公共类AndroidClient延伸活动{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);
} 保护类连接扩展的AsyncTask<弦乐,DataInputStream所,字符串>
 {@覆盖
在preExecute保护无效()
{
        Log.i(makemachine,上preExecute());
     // TODO自动生成方法存根
     Socket套接字= NULL;
     DataOutputStream类DataOutputStream类= NULL;
     DataInputStream以DataInputStream以= NULL;     尝试{
      插座=新的Socket(10.0.2.2,5000);
      DataOutputStream类=新的DataOutputStream类(socket.getOutputStream());
      DataInputStream以=新DataInputStream所(socket.getInputStream());
      dataOutputStream.writeUTF(textOut.g​​etText()的toString());
      publishProgress(DataInputStream所);     }
     赶上(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();
       }
      }
     }        super.on preExecute();}保护无效onProgressUpdate(DataInputStream以DataInputStream所...){
    Log.v(以下简称mesage长度是,dataInputStream.toString());
    textIn.setText(dataInputStream.toString());
}@覆盖
保护无效onPostExecute(字符串结果)
{
        super.onPostExecute(结果);        Log.i(连接,onPostExecute():+结果);}@覆盖
保护字符串doInBackground(字符串... PARAMS){
    // TODO自动生成方法存根
    返回null;
}
 }
 Button.OnClickListener buttonSendOnClickListener
  =新Button.OnClickListener(){
 公共无效的onClick(查看arg0中)
 {     Log.v(发送消息,到服务器);
  }};
}

日志是:

  1月2日至六日:55:31.421:E / AndroidRuntime(582):致命异常:主要
 1月2日至6日:55:31.421:E / AndroidRuntime(582):android.os.NetworkOnMainThreadException
 1月2日至6日:55:31.421:E / AndroidRuntime(582):在android.os.StrictMode $ AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1099)
 1月2日至6日:55:31.421:E / AndroidRuntime(582):在libcore.io.BlockGuardOs.connect(BlockGuardOs.java:84)
 1月2日至6日:55:31.421:E / AndroidRuntime(582):在libcore.io.IoBridge.connectErrno(IoBridge.java:127)
 1月2日至6日:55:31.421:E / AndroidRuntime(582):在libcore.io.IoBridge.connect(IoBridge.java:112)
 1月2日至6日:55:31.421:E / AndroidRuntime(582):在java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192)
 1月2日至6日:55:31.421:E / AndroidRuntime(582):在java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
 1月2日至6日:55:31.421:E / AndroidRuntime(582):在java.net.Socket.startupSocket(Socket.java:566)
 1月2日至6日:55:31.421:E / AndroidRuntime(582):在java.net.Socket.tryAllAddresses(Socket.java:127)
 1月2日至6日:55:31.421:E / AndroidRuntime(582):在java.net.Socket中的<&初始化GT;(Socket.java:177)
 1月2日至6日:55:31.421:E / AndroidRuntime(582):在java.net.Socket中的<&初始化GT;(Socket.java:149)
 1月2日至6日:55:31.421:E / AndroidRuntime(582):在com.exercise.AndroidClient.AndroidClient $ 1.onClick(AndroidClient.java:45)
 1月2日至6日:55:31.421:E / AndroidRuntime(582):在android.view.View.performClick(View.java:3511)
 1月2日至6日:55:31.421:E / AndroidRuntime(582):在android.view.View $ PerformClick.run(View.java:14105)
 1月2日至6日:55:31.421:E / AndroidRuntime(582):在android.os.Handler.handleCallback(Handler.java:605)
 1月2日至6日:55:31.421:E / AndroidRuntime(582):在android.os.Handler.dispatchMessage(Handler.java:92)
 1月2日至6日:55:31.421:E / AndroidRuntime(582):在android.os.Looper.loop(Looper.java:137)
 1月2日至6日:55:31.421:E / AndroidRuntime(582):在android.app.ActivityThread.main(ActivityThread.java:4424)
1月2日至6日:55:31.421:E / AndroidRuntime(582):在java.lang.reflect.Method.invokeNative(本机方法)
1月2日至6日:55:31.421:E / AndroidRuntime(582):在java.lang.reflect.Method.invoke(Method.java:511)
1月2日至6日:55:31.421:E / AndroidRuntime(582):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:784)
1月2日至6日:55:31.421:E / AndroidRuntime(582):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
1月2日至6日:55:31.421:E / AndroidRuntime(582):在dalvik.system.NativeStart.main(本机方法)

我看书上说,我们不能实现thread.That就是为什么我现在用的是AsyncTask的thread.But即使这样,我得到了NetworkOnMainThread Exception.Please的UI联网线程说我在我的计划,以及如何纠正这些错误。


解决方案

 这就是为什么我使用AsyncTask的thread.But即使这样,我得到了NetworkOnMainThread例外。

其实你是not.You需要直接调用execute()而不是调用doInBackground(),否则你不使用任何的AsyncTask的提供的管道,而你只是直接调用该方法在UI主题。

I am trying to implement a server client program to send message in Android.Can you please say me what are the errors in my code and how to rectify them? The server is running fine but the client program has one error.

This is the server code and this is running fine.

package com.app.MyServer;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.widget.TextView;
public class MyServer extends Activity {
ServerSocket ss = null;
String mClientMsg = "";
Thread myCommsThread = null;
protected static final int MSG_ID = 0x1337;
public static final int SERVERPORT = 6000;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    TextView tv = (TextView) findViewById(R.id.TextView01);
    tv.setText("Nothing from client yet");
    this.myCommsThread = new Thread(new CommsThread());
    this.myCommsThread.start();
}
@Override
protected void onStop() {
    super.onStop();
    try {
            // make sure you close the socket upon exiting
            ss.close();
    } catch (IOException e) {
            e.printStackTrace();
    }
}
Handler myUpdateHandler = new Handler() {
    public void handleMessage(Message msg) {
            switch (msg.what) {
            case MSG_ID:
                    TextView tv = (TextView) findViewById(R.id.TextView01);
                    tv.setText(mClientMsg);
                    break;
            default:
                    break;
            }
            super.handleMessage(msg);
    }
};
class CommsThread implements Runnable {
    public void run() {
            Socket s = null;
            try {
                    ss = new ServerSocket(SERVERPORT );
                    Log.v("SErver ",ss.toString());
            } catch (IOException e) {
                    e.printStackTrace();
            }
            while (!Thread.currentThread().isInterrupted()) {
                    Message m = new Message();
                    Log.v("Message ",m.toString());
                    m.what = MSG_ID;
                    try {
                            if (s == null && ss!=null)
                            {
                                s = ss.accept();
                                Log.v("Drrr","It is not null");
                            }
                            else
                                Log.v("The thing is ", "ss is null");

                            BufferedReader input = new BufferedReader(new InputStreamReader(s.getInputStream()));
                            String st = null;
                            st = input.readLine();
                            mClientMsg = st;
                            myUpdateHandler.sendMessage(m);
                    } catch (IOException e) {
                            Log.v("Error ",e.toString());
                            e.printStackTrace();
                    }
            }
    }
}
}

The Client Code :

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.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class AndroidClient 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);
}

 protected class connect extends AsyncTask<String,DataInputStream,String>
 {



@Override
protected void onPreExecute() 
{
        Log.i( "makemachine", "onPreExecute()" );
     // TODO Auto-generated method stub
     Socket socket = null;
     DataOutputStream dataOutputStream = null;
     DataInputStream dataInputStream = null;

     try {
      socket = new Socket("10.0.2.2", 5000);
      dataOutputStream = new DataOutputStream(socket.getOutputStream());
      dataInputStream = new DataInputStream(socket.getInputStream());
      dataOutputStream.writeUTF(textOut.getText().toString());
      publishProgress(dataInputStream);

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

        super.onPreExecute();

}

protected void onProgressUpdate(DataInputStream... dataInputStream) {
    Log.v("The mesage length is ",dataInputStream.toString());
    textIn.setText(dataInputStream.toString());
}



@Override
protected void onPostExecute( String result ) 
{
        super.onPostExecute(result);

        Log.i( "connected", "onPostExecute(): " + result );

}

@Override
protected String doInBackground(String... params) {
    // TODO Auto-generated method stub
    return null;
}
 }
 Button.OnClickListener buttonSendOnClickListener
  = new Button.OnClickListener(){


 public void onClick(View arg0) 
 {

     Log.v("Sending the message ","to the server");
  }};
}

The Log is :

 02-06 01:55:31.421: E/AndroidRuntime(582): FATAL EXCEPTION: main
 02-06 01:55:31.421: E/AndroidRuntime(582): android.os.NetworkOnMainThreadException
 02-06 01:55:31.421: E/AndroidRuntime(582):     at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1099)
 02-06 01:55:31.421: E/AndroidRuntime(582):     at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:84)
 02-06 01:55:31.421: E/AndroidRuntime(582):     at libcore.io.IoBridge.connectErrno(IoBridge.java:127)
 02-06 01:55:31.421: E/AndroidRuntime(582):     at libcore.io.IoBridge.connect(IoBridge.java:112)
 02-06 01:55:31.421: E/AndroidRuntime(582):     at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192)
 02-06 01:55:31.421: E/AndroidRuntime(582):     at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
 02-06 01:55:31.421: E/AndroidRuntime(582):     at java.net.Socket.startupSocket(Socket.java:566)
 02-06 01:55:31.421: E/AndroidRuntime(582):     at java.net.Socket.tryAllAddresses(Socket.java:127)
 02-06 01:55:31.421: E/AndroidRuntime(582):     at java.net.Socket.<init>(Socket.java:177)
 02-06 01:55:31.421: E/AndroidRuntime(582):     at java.net.Socket.<init>(Socket.java:149)
 02-06 01:55:31.421: E/AndroidRuntime(582):     at com.exercise.AndroidClient.AndroidClient$1.onClick(AndroidClient.java:45)
 02-06 01:55:31.421: E/AndroidRuntime(582):     at android.view.View.performClick(View.java:3511)
 02-06 01:55:31.421: E/AndroidRuntime(582):     at android.view.View$PerformClick.run(View.java:14105)
 02-06 01:55:31.421: E/AndroidRuntime(582):     at android.os.Handler.handleCallback(Handler.java:605)
 02-06 01:55:31.421: E/AndroidRuntime(582):     at android.os.Handler.dispatchMessage(Handler.java:92)
 02-06 01:55:31.421: E/AndroidRuntime(582):     at android.os.Looper.loop(Looper.java:137)
 02-06 01:55:31.421: E/AndroidRuntime(582):     at android.app.ActivityThread.main(ActivityThread.java:4424)
02-06 01:55:31.421: E/AndroidRuntime(582):  at java.lang.reflect.Method.invokeNative(Native Method)
02-06 01:55:31.421: E/AndroidRuntime(582):  at java.lang.reflect.Method.invoke(Method.java:511)
02-06 01:55:31.421: E/AndroidRuntime(582):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
02-06 01:55:31.421: E/AndroidRuntime(582):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
02-06 01:55:31.421: E/AndroidRuntime(582):  at dalvik.system.NativeStart.main(Native Method)

I read that we cannot implement the networking thread in the UI thread.That is why I am using the AsyncTask thread.But even then I get the NetworkOnMainThread Exception.Please say me the errors in my program and how to rectify them.

解决方案

That is why I am using the AsyncTask thread.But even then I get the NetworkOnMainThread Exception.

Actually you are not.You need to call execute() instead of calling doInBackground() directly, otherwise you're not using any of the plumbing provided by the AsyncTask, and you're just calling the method directly in the UI thread.

这篇关于什么是错误?新到Android编程的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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