B
BlupBlup
Ambitioniertes Mitglied
- 1
Hallo ich implementiere gerade einen kleinen Chat.
Die Teilnehmer am Chat sind Smartphones und ein Rechner der als
Server fungiert.
Die Smartphones verschicken über einen Socket Nachrichten an
den Server und der Server verschickt die Nachrichten an alle anderen Smarpthones weiter. Der Server selbst hat auch ein Eingabe- und
Ausgabefenster, so dass auch er am Chat teilnehmen kann.
Die Smartphones haben ein Eingabefeld (EditText) und ein Ausgabefeld (TextView). Die TextView ist in einer ScrollView eingebettet.
Mein Problem ist nun folgendes. Sobald ich Nachrichten vom Server an die
Smartphones verschicke, werden die Nachrichten nicht immer in der TextView angezeigt. Die Nachricht kommt aber 100% am Smarpthone an.
Ich lasse sie mir zur Kontrolle über einen Toast ausgeben. Nachdem ich
den Toast ausgegeben habe setze ich über tv.append(incomingChatText); die Nachricht in die TextView und rufe invalidate auf. Allerdings wird die Nachricht dennoch nicht angezeigt. Erst wenn ich einmal in den EditText klicke und damit die Tastatur öffne und anschließend wieder schließe wird die TextView aktualisiert und die Nachricht angezeigt.
Die Teilnehmer am Chat sind Smartphones und ein Rechner der als
Server fungiert.
Die Smartphones verschicken über einen Socket Nachrichten an
den Server und der Server verschickt die Nachrichten an alle anderen Smarpthones weiter. Der Server selbst hat auch ein Eingabe- und
Ausgabefenster, so dass auch er am Chat teilnehmen kann.
Die Smartphones haben ein Eingabefeld (EditText) und ein Ausgabefeld (TextView). Die TextView ist in einer ScrollView eingebettet.
Mein Problem ist nun folgendes. Sobald ich Nachrichten vom Server an die
Smartphones verschicke, werden die Nachrichten nicht immer in der TextView angezeigt. Die Nachricht kommt aber 100% am Smarpthone an.
Ich lasse sie mir zur Kontrolle über einen Toast ausgeben. Nachdem ich
den Toast ausgegeben habe setze ich über tv.append(incomingChatText); die Nachricht in die TextView und rufe invalidate auf. Allerdings wird die Nachricht dennoch nicht angezeigt. Erst wenn ich einmal in den EditText klicke und damit die Tastatur öffne und anschließend wieder schließe wird die TextView aktualisiert und die Nachricht angezeigt.
Code:
public class ClientThread extends Thread
{
private final static String LINESEPARATOR = System.getProperty("line.separator");
private Socket clientSocket;
private BufferedReader in;
private PrintWriter out;
private boolean run;
private String ip;
private int port;
private Activity activity;
private TextView tv;
private String incomingChatText;
private ScrollView testing2ScrollView1;
public ClientThread(String ip, int port, Activity activity)
{
this.ip = ip;
this.port = port;
this.activity = activity;
this.tv = (TextView)this.activity.findViewById(R.id.tv);
this.testing2ScrollView1 = (ScrollView)this.activity.findViewById(R.id.testing2ScrollView1);
}
public void run()
{
try
{
this.clientSocket = new Socket(ip, port);
this.in = new BufferedReader(new InputStreamReader(this.clientSocket.getInputStream()));
this.out = new PrintWriter(this.clientSocket.getOutputStream(), true);
this.run = true;
while(run)
{
this.incomingChatText = this.in.readLine().trim() + LINESEPARATOR + LINESEPARATOR;
this.tv.post(new Runnable(){
@Override
public void run()
{
Toast.makeText(activity, incomingChatText, Toast.LENGTH_LONG).show();
tv.append(incomingChatText);
testing2ScrollView1.pageScroll(View.FOCUS_DOWN);
testing2ScrollView1.invalidate();
tv.invalidate();
}
});
}
}
catch (UnknownHostException uhe)
{
uhe.printStackTrace();
}
catch (IOException ioe)
{
if(this.clientSocket != null)
{
try
{
this.clientSocket.close();
}
catch (IOException ioe2)
{
ioe2.printStackTrace();
}
}
ioe.printStackTrace();
}
}
public void sendMessage(String message)
{
this.out.print(message);
this.out.println();
if(message.equals("BYE"))
{
this.run = false;
}
}
public void setRun(boolean run)
{
this.run = run;
}
}
Code:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<Button
android:id="@+id/testing2doSomething"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true"
android:text="doSomething"
android:onClick="doSomething" />
<Button
android:id="@+id/testing2Button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_above="@+id/testing2doSomething"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true"
android:onClick="goToActivity3"
android:text="Zur Activity 3" />
<ScrollView
android:id="@+id/testing2ScrollView1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_above="@+id/testing2SendButton"
android:layout_alignParentTop="true"
android:background="@android:color/white"
android:scrollbars="vertical" >
<TextView
android:id="@+id/tv"
android:layout_width="fill_parent"
android:layout_height="250dp"
android:background="@android:color/white"
android:scrollbars="vertical"
android:textAppearance="?android:attr/textAppearanceLarge"
android:textColor="@android:color/black" />
</ScrollView>
<Button
android:id="@+id/testing2SendButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="@+id/et"
android:layout_alignParentRight="true"
android:layout_alignTop="@+id/et"
android:text="Send"
android:onClick="send" />
<EditText
android:id="@+id/et"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_above="@+id/testing2Button1"
android:layout_alignParentLeft="true"
android:layout_toLeftOf="@+id/testing2SendButton"
android:ems="10"
android:hint="Nachricht eingeben" >
<requestFocus />
</EditText>
</RelativeLayout>