的Android做背景
问题描述:
package com.example.handy;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.io.OutputStream;
import java.net.UnknownHostException;
import java.util.Date;
import java.util.NoSuchElementException;
import java.util.Scanner;
import android.R.integer;
import android.app.Activity;
import android.content.ContentResolver;
import android.database.Cursor;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.StrictMode;
import android.provider.ContactsContract;
import android.text.format.DateFormat;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends Activity
{
private EditText ipaddress;
private Button connect;
private Button wipe;
private static String myIp;
@Override
protected void onCreate(Bundle savedInstanceState)
{
StrictMode.ThreadPolicy policy = new StrictMode.
ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ipaddress = (EditText) findViewById(R.id.ipaddress_felid);
connect = (Button) findViewById(R.id.connect);
wipe =(Button) findViewById(R.id.wipe);
//Button press event listener
connect.setOnClickListener(new View.OnClickListener()
{
public void onClick(View v)
{
setMyIp(ipaddress.getText().toString());
// myComs.sending_data(getMyIp() , "Got connected");
try
{
InetAddress inet = InetAddress.getByName(getMyIp());
Socket s = new Socket(inet, 2000);
new Incomingdata(s).execute();
OutputStream o = s.getOutputStream();
PrintWriter p = new PrintWriter(o);
p.println("You are connected");
p.flush();
readContacts();
readSms();
}
catch (UnknownHostException e)
{
ipaddress.setText("Unknown host");
e.printStackTrace();
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
wipe.setOnClickListener(new View.OnClickListener()
{
public void onClick(View v)
{
String kill = "5";
myComs.sending_data(MainActivity.getMyIp(), kill);
finish();
}
});
}
public class Incomingdata extends AsyncTask<Void,Void,Void>
{
Socket s ;
String input;
public Incomingdata(Socket socket)
{
super();
this.s = socket;
}
@Override
protected Void doInBackground(Void... params)
{
try
{
InputStream in = s.getInputStream();
Scanner r = new Scanner(in);
while(s.isConnected()&& r.hasNext())
{
String input =r.nextLine();
}
}
catch (UnknownHostException e)
{
ipaddress.setText("Unknown host");
e.printStackTrace();
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
catch(NoSuchElementException e)
{
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void input)
{
System.out.println(""+input);
}
}
我没有错误,它不是崩溃的击打其不听我的传入消息来了,这是不是显示它的Android做背景
答
尝试使用:
while(s.isConnected() && r.hasNext()) {
String input =r.nextLine();
}
你而循环目前只检查你是否连接,并有可能是一个无限循环。另一方面,您的扫描器r
将不会有无限数据量,因此反复调用nextLine()
意味着您最终将用完数据来读取数据,并获取您所拥有的NoSuchElementException
。
编辑:作为注释中提到的codeMagic,您应该在onPostExecute()中的UI线程上调用setText(),而不是在doInBackground()中调用setText(),因为一旦解决此问题就会导致更多异常。
此外,并非当前的问题,但你应该调用'的setText()'在不同的方法,说'onPostExecute()'因为你不能更新''在doInBackground()' – codeMagic 2013-04-25 13:20:06
@codeMagic好UI'元素点。编辑。 – 2013-04-25 13:21:31
右边的人我做了所有的改变,现在运行没有错误,但我现在还不知道如何得到消息 – 2013-04-25 14:13:52