Sochet Receive Event?

Status
Niet open voor verdere reacties.
Ik heb nu dit, hij start nu wel op maar hij verbind niet eens meer:

Code:
package com.example.awmobile;


import java.io.*;

import java.net.Socket;
import java.net.UnknownHostException;

import android.os.Bundle;
import android.os.Handler;
import android.os.StrictMode;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.view.Menu;
import android.os.AsyncTask; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.ListView;
import android.widget.TextView;



@SuppressLint("NewApi") public class MainActivity extends Activity {
	Socket s;
	private boolean mRun = false;
	private Handler handler = new Handler();

	
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        TextView t = (TextView)findViewById(R.id.textView1);
    	
    	
        
    
        final TextView textView1 = (TextView)findViewById(R.id.textView1);

        
        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
        StrictMode.setThreadPolicy(policy); 
    
        
        

        new Thread(new ClientConnection()).start();


	     
	    
        
       


    
    Button button1 = (Button) findViewById(R.id.button1);
    Button button2 = (Button) findViewById(R.id.button2);
    Button button3 = (Button) findViewById(R.id.button3);
    button1.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
        	
             
        	
        }
    });
    
    
    button2.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
        	 //outgoing stream redirect to socket
            
			try {
				OutputStream out = s.getOutputStream();       
				PrintWriter output = new PrintWriter(out);             
				output.println("Hello from Android");     
				output.flush();
				//output.close();

	            
	            
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
            
        }});
    
    button3.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
        
        }
        });
        
    }
       
    
  //private class
    private class ClientConnection implements Runnable {

    	        @Override
    	        public void run() {

    	            try {
    	                
    	 
    	                s = new Socket("192.168.1.3", 4444);
    	 
    	            } catch (UnknownHostException e1) {
    	                e1.printStackTrace();
    	            } catch (IOException e1) {
    	                e1.printStackTrace();
    	            }
    	            
    	            
    	            
    	            
    	            
    	            
    	        	//We creëren een reader die luistert naar de connectie (een inputstream).
    		        BufferedReader in;
    		        String ontvangenBericht;
    		        final TextView textView1 = (TextView)findViewById(R.id.textView1);
    				
    					try {
    						in = new BufferedReader(new InputStreamReader(s.getInputStream()));
    						 //nu luisteren we net zo lang totdat we niks meer ontvangen (connectie is gesloten):
    						StringBuilder ontvangenData = new StringBuilder();
    				        while((ontvangenBericht = in.readLine()) != null) {   //de in.readLine levert een string op, deze string wordt geassigned aan de variabele ontvangenBericht daarna wordt gekeken of deze variabele de waarde null bevat.
    							   //we hebben data ontvangen van de server.
    							  textView1.setText(ontvangenBericht);
    							   ontvangenBericht = null;

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


    


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

Dit moet allemaal in de MainActivity, toch?
 
Heb je je port geforward? Dit wordt ook in de vermelde tutorial gedaan.
Ik heb je code een klein beetje opgeschoond. Probeer het nu eens?

Loop eens met de debugger door je programma, dan kan je zien wat het programma allemaal aanroept. Zet een paar breakpoints en druk een paar keer op f5 (zie: http://www.vogella.com/articles/EclipseDebugging/article.html) Als het goed is heb je twee threads. De eerste thread (ui-thread) creërt je activity, de tweede thread start, maakt een socket en blijft hangen in de while-lus totdat de connectie verloren gaat. Deze threads werken naast elkaar en krijgen allebei processor-tijd.


Code:
package com.example.awmobile;


import java.io.*;

import java.net.Socket;
import java.net.UnknownHostException;

import android.os.Bundle;
import android.os.Handler;
import android.os.StrictMode;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.view.Menu;
import android.os.AsyncTask; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.ListView;
import android.widget.TextView;

@SuppressLint("NewApi") public class MainActivity extends Activity {
	Socket s;
	private boolean mRun = false;
	private Handler handler = new Handler();
        private TextView textView;

	
       @Override
       protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
        
            textView = (TextView)findViewById(R.id.textView1); //bevind zich in activity_main.xml :)
    
            new Thread(new ClientConnection()).start();
            Button button1 = (Button) findViewById(R.id.button1);
            Button button2 = (Button) findViewById(R.id.button2);
            Button button3 = (Button) findViewById(R.id.button3);
            button1.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
 	
                }
            });
    
    //bij elke klik op button2 sturen wij 'hello from android' naar de socket. 
            button2.setOnClickListener(new View.OnClickListener() {
                 public void onClick(View v) {
        	 //outgoing stream redirect to socket
            
		       try {
		            OutputStream out = s.getOutputStream();       
			    PrintWriter output = new PrintWriter(out);             
			    output.println("Hello from Android");     //we sturen deze string naar de socket.
			    output.flush();
			    output.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
            
        }});
    
        button3.setOnClickListener(new View.OnClickListener() {
                public void onClick(View v) {
        
                }
        });
        
    }
       
  //private class
    private class ClientConnection implements Runnable {

    	        @Override
    	        public void run() {

    	            try {
    	                s = new Socket("192.168.1.3", 4444);
    	 
    	            } catch (UnknownHostException e1) {
    	                e1.printStackTrace();
    	            } catch (IOException e1) {
    	                e1.printStackTrace();
    	            }

    	        	//We creëren een reader die luistert naar de connectie (een inputstream). We zetten de text in textview met de data die wij van de socket ontvangen.
    		        String ontvangenBericht;
                        StringBuilder ontvangenData = new StringBuilder();
    			try {
    			      BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream()));
    			      //nu luisteren we net zo lang totdat we niks meer ontvangen (connectie is gesloten):
    		              while((ontvangenBericht = in.readLine()) != null) {   //de in.readLine levert een string op, deze string wordt geassigned aan de variabele ontvangenBericht daarna wordt gekeken of deze variabele de waarde null bevat.
    					//we hebben data ontvangen van de server.
    					textView.setText(ontvangenBericht);
    					ontvangenBericht = null;

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

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
    
}
 
Laatst bewerkt:
De poorten staan allemaal open voor zover ik weet, het gaat namelijk ook allemaal intern.
Ik heb je code nu gebruikt, hij verbind, maar hij ontvangt nog altijd niks. Er gebeurt ook helemaal niks in de logs.
 
Hoe ziet je server kant eruit? Je vraagt namelijk de uitvoer van de server socket op. Als je geen data vanuit je server naar de clients stuurt, ontvangt je client niets.

Voor een voorbeeld, bekijk de links die ik gegeven had.
 
Server is gemaakt in Visual Basic 6, en het is eigenlijk ook de bedoeling dat het in VB6 blijft..

Code:
Private Sub Command2_Click()
Winsock1.SendData "hoi"
End Sub
 
Excuses voor het late antwoord.

Ik had in mijn code jouw threadpolicy weggehaald, omdat ik het niet goed kende. Het blijkt dat je het moet toevoegen in nieuwere versies van android.

Probeer mijn code eens inclusief de thread policy

Code:
package com.example.awmobile;


import java.io.*;

import java.net.Socket;
import java.net.UnknownHostException;

import android.os.Bundle;
import android.os.Handler;
import android.os.StrictMode;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.view.Menu;
import android.os.AsyncTask; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.ListView;
import android.widget.TextView;

@SuppressLint("NewApi") public class MainActivity extends Activity {
	Socket s;
	private boolean mRun = false;
	private Handler handler = new Handler();
        private TextView textView;

	
       @Override
       protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder() .detectAll().penaltyLog().build(); 
            StrictMode.setThreadPolicy(policy);
            
            setContentView(R.layout.activity_main);
            textView = (TextView)findViewById(R.id.textView1); //bevind zich in activity_main.xml :)
    
            new Thread(new ClientConnection()).start();
            Button button1 = (Button) findViewById(R.id.button1);
            Button button2 = (Button) findViewById(R.id.button2);
            Button button3 = (Button) findViewById(R.id.button3);
            button1.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
 	
                }
            });
    
    //bij elke klik op button2 sturen wij 'hello from android' naar de socket. 
            button2.setOnClickListener(new View.OnClickListener() {
                 public void onClick(View v) {
        	 //outgoing stream redirect to socket
            
		       try {
		            OutputStream out = s.getOutputStream();       
			    PrintWriter output = new PrintWriter(out);             
			    output.println("Hello from Android");     //we sturen deze string naar de socket.
			    output.flush();
			    output.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
            
        }});
    
        button3.setOnClickListener(new View.OnClickListener() {
                public void onClick(View v) {
        
                }
        });
        
    }
       
  //private class
    private class ClientConnection implements Runnable {

    	        @Override
    	        public void run() {

    	            try {
    	                s = new Socket("192.168.1.3", 4444);
    	 
    	            } catch (UnknownHostException e1) {
    	                e1.printStackTrace();
    	            } catch (IOException e1) {
    	                e1.printStackTrace();
    	            }

    	        	//We creëren een reader die luistert naar de connectie (een inputstream). We zetten de text in textview met de data die wij van de socket ontvangen.
    		        String ontvangenBericht;
                        StringBuilder ontvangenData = new StringBuilder();
    			try {
    			      BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream()));
    			      //nu luisteren we net zo lang totdat we niks meer ontvangen (connectie is gesloten):
    		              while((ontvangenBericht = in.readLine()) != null) {   //de in.readLine levert een string op, deze string wordt geassigned aan de variabele ontvangenBericht daarna wordt gekeken of deze variabele de waarde null bevat.
    					//we hebben data ontvangen van de server.
    					textView.setText(ontvangenBericht);
    					ontvangenBericht = null;

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

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
    
}
 
Laatst bewerkt:
Ik zie zo geen fouten. Ik zal er morgen even naar kijken en het dan ook testen. Het duurt nu al namelijk wel heel lang ;)
 
Ik heb even een nieuw projectje gemaakt en dezelfde manier gebruikt als de manier die jij gebruikt.
Het probleem waar ik tegenaan liep in de code is dat de socket niet werd aangemaakt IOException werd gegooid, omdat ik geen permissie in het manifest had gezet. Heb jij dit wel gedaan?

Verder heb ik de socket initialisatie in de run methode gezet (de methode die wordt aangeroepen door de Thread.start aanroep).

Als extra-tje heb ik de knop z'n tekst via de juiste thread gezet met behulp van een nieuwe Handler.

Zet de volgende regel tussen de manifest tags in je manifest bestand.
Code:
<uses-permission android:name="android.permission.INTERNET" />

MainActivity.java
Code:
public class MainActivity extends Activity {
	private Button connectButton;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		connectButton = (Button) MainActivity.this.findViewById(R.id.clickSocketConnection);
		connectButton.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				new Thread(new ClientConnection()).start();
			}
		});
	}

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

	  //private class
    private class ClientConnection implements Runnable {
    	        
    	@Override
    	public void run() {
    				Socket s = null;
    	            
    				try {
    	                s = new Socket("192.168.2.112", 1234);
    	 
    	            } catch (UnknownHostException e1) {
    	            	System.err.println(e1.getMessage());
    	            } catch (IOException e1) {
    	            	System.err.println(e1.getMessage());
    	            }

    	        	//We creëren een reader die luistert naar de connectie (een inputstream). We zetten de text in textview met de data die wij van de socket ontvangen.
    		        String ontvangenBericht;
    		        final StringBuilder ontvangenData = new StringBuilder();
                    try {
    			    	BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream()));
    			    	//nu luisteren we net zo lang totdat we niks meer ontvangen (connectie is gesloten):
    		            while((ontvangenBericht = in.readLine()) != null) {   //de in.readLine levert een string op, deze string wordt geassigned aan de variabele ontvangenBericht daarna wordt gekeken of deze variabele de waarde null bevat.
	    					//we hebben data ontvangen van de server.
	    					if(ontvangenBericht != "") { //een extra controle zodat we niet elke keer de knop z'n tekst zetten :)
	    						ontvangenData.append(ontvangenBericht);
	    					}
    		            	ontvangenBericht = null;
    		            	//dit kan natuurlijk mooier, maar zorgt ervoor dat de knop z'n tekst via de juiste thread wordt gezet!
    		            	Handler textSetter= new Handler(Looper.getMainLooper());
    						textSetter.post(new Runnable() {
    						    public void run()
    						    {
    						    	connectButton.setText(ontvangenData.toString());
    						    }
    						});
    		            }      
	    			} catch (IOException e2) {
	    				// TODO Auto-generated catch block
	    				System.err.println(e2.getMessage());
	    			}
    	      }	 
    }
	
}

main_activity.xml (een scherm met een knopje).
Code:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <Button 
        android:layout_width="wrap_content"
        android:id="@+id/clickSocketConnection"
        android:text="Click to connect."
        android:layout_height="wrap_content">
    </Button>

</RelativeLayout>

ServerTest.java (een simpel servertje dat antwoord als een client verbinding maakt).
Code:
public class ServerTest {
	
	public static void main(String args[]) {
		ServerSocket socket = null;
		
			try {
				socket = new ServerSocket(1234);
				Socket clientSocket = socket.accept();
				PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
				out.println("We are connected, dear little client :)");
				socket.close();
			} catch (Exception e) {
				System.err.println(e.getMessage());
			}
	}
}

Met vriendelijke groet,
Newbi
 
Laatst bewerkt:
De internet permissie heb ik er idd al bijgezet.
Heb hem net geprobeerd, er gebeurt niks, totdat ik de verbinding sluit. Dan komen alle berichten aan elkaar geplakt op de knop..
Dit is de code (hetzelfde op het IP en button naam aangepast):

Code:
package com.example.awmobile;


import java.io.*;

import java.net.Socket;
import java.net.UnknownHostException;

import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.StrictMode;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.view.Menu;
import android.view.View.OnClickListener;
import android.os.AsyncTask; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.ListView;
import android.widget.TextView;

public class MainActivity extends Activity {
	private Button connectButton;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		connectButton = (Button) MainActivity.this.findViewById(R.id.button1);
		connectButton.setOnClickListener(new OnClickListener() {
			
			public void onClick(View v) {
				new Thread(new ClientConnection()).start();
			}
		});
	}

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

	  //private class
    private class ClientConnection implements Runnable {
    	        
    	@Override
    	public void run() {
    				Socket s = null;
    	            
    				try {
    	                s = new Socket("192.168.1.3", 4444);
    	 
    	            } catch (UnknownHostException e1) {
    	            	System.err.println(e1.getMessage());
    	            } catch (IOException e1) {
    	            	System.err.println(e1.getMessage());
    	            }

    	        	//We creëren een reader die luistert naar de connectie (een inputstream). We zetten de text in textview met de data die wij van de socket ontvangen.
    		        String ontvangenBericht;
    		        final StringBuilder ontvangenData = new StringBuilder();
                    try {
    			    	BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream()));
    			    	//nu luisteren we net zo lang totdat we niks meer ontvangen (connectie is gesloten):
    		            while((ontvangenBericht = in.readLine()) != null) {   //de in.readLine levert een string op, deze string wordt geassigned aan de variabele ontvangenBericht daarna wordt gekeken of deze variabele de waarde null bevat.
	    					//we hebben data ontvangen van de server.
	    					if(ontvangenBericht != "") { //een extra controle zodat we niet elke keer de knop z'n tekst zetten :)
	    						ontvangenData.append(ontvangenBericht);
	    					}
    		            	ontvangenBericht = null;
    		            	//dit kan natuurlijk mooier, maar zorgt ervoor dat de knop z'n tekst via de juiste thread wordt gezet!
    		            	Handler textSetter= new Handler(Looper.getMainLooper());
    						textSetter.post(new Runnable() {
    						    public void run()
    						    {
    						    	connectButton.setText(ontvangenData.toString());
    						    }
    						});
    		            }      
	    			} catch (IOException e2) {
	    				// TODO Auto-generated catch block
	    				System.err.println(e2.getMessage());
	    			}
    	      }	 
    }
	
}
 
Welke server-kant gebruik je? In het voorbeeld gebruik ik gewoon een simpele server die alleen bij een nieuwe connectie één maal tekst verstuurd. Dit gebeurd echter wel direct bij mij. Ik heb hem getest op android 4.0. Ik denk dat je fout in de server zit. Wil je eens met je debugger een breakpoint bij het ontvangen van de data zetten? Dan kun je kijken wanneer er data wordt ontvangen. http://www.vogella.com/articles/EclipseDebugging/article.html

Verder kun je proberen om de threadpolicy toe te voegen. Dit schijnt zoals al eerder vermeld bij sommige android versies te helpen :)

In de onCreate methode:
Code:
 StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
        StrictMode.setThreadPolicy(policy);


Groeten,
Newbi
 
Laatst bewerkt:
Jah maar bij jouw staat er uiteraard socket.close(); vlak onder, probeer anders eens zonder die close? (ik kan helaas geen 2 emulators tegelijk draaien :(, heb zelf ook met een server-client getest in VB6 en gaat perfect, dusjah..).
Ik snap zelf echt helemaal niets van dat debuggen om eerlijk te zijn.. :shocked:
De Threadpolicy heeft geen verschil gemaakt.
 
Ik kan de code pas morgen testen. Echter, kan het zijn dat jij geen nieuwe regels stuurt? De java code vraagt namelijk een stuk tekst tot een nieuwe regel-teken (/n/r) is gestuurd (http://docs.oracle.com/javase/7/docs/api/java/io/BufferedReader.html#readLine()). Het zou wel verklaren waarom je alle data pas ontvangt na het sluiten van de connectie.

Ik ben niet echt thuis in vb, maar volgens mij kan je: vbCr gebruiken :)
 
Laatst bewerkt:
Oh idd, sorry wist niet dat er een lege regel moest. Vbcrlf was het inderdaad. Hij ontvangt hem nu onmiddelijk, maar als ik nu een 2de keer "hoi" stuur, dan krijg ik als resultaat "hoihoi", dan weer "hoihoihoi", enzv. Hoe los ik dat op?
 
Dat is gewoon standaard java ;) Neem een kijkje naar de code. Je roept de append (toevoegen) methode aan op een stringbuilder object. Dit betekent dat de ontvangen data wordt ge-append (toegevoegd) aan de ontvangenData, daarna wordt de ontvangen data op de knop gezet. Dit betekent dus dat je de stringbuffer leeg moet maken in de while-lus. Als je toch maar één regel gebruikt kan je net zo goed geen stringbuffer gebruiken, maar de inhoud van de ontvangenBericht variabele op de knop zetten. Wat wil je precies bereiken? Ik had een stringbuffer toegevoegd, omdat ik verwachtte dat je veel data wilt oversturen en er daarna (na ontvangst van veel data) iets mee wilt doen.

Code:
while((ontvangenBericht = in.readLine()) != null) {  	
        Handler textSetter= new Handler(Looper.getMainLooper());
    	textSetter.post(new Runnable() {
    	      public void run() {
    			connectButton.setText(ontvangenBericht);
    	      }
    	});
}
Groet,
Newbi
 
Laatst bewerkt:
Moet eigenlijk een soort chat applicatie worden, soort van chatruimte. Heb nu dit:
Code:
final String ontvangenBericht;
    		        final StringBuilder ontvangenData = new StringBuilder();
                    try {
    			    	BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream()));
    			    	//nu luisteren we net zo lang totdat we niks meer ontvangen (connectie is gesloten):
    			    	while((ontvangenBericht = in.readLine()) != null) {  	
    			            Handler textSetter= new Handler(Looper.getMainLooper());
    			        	textSetter.post(new Runnable() {
    			        	      public void run() {
    			        			connectButton.setText(ontvangenBericht);
    			        	      }
    			        	});
    			    }    
	    			} catch (IOException e2) {
	    				// TODO Auto-generated catch block
	    				System.err.println(e2.getMessage());
	    			}

Hij geeft een error met ontvangenBericht. Als ik er final string van maak, zegt hij bij de while()
The final local variable ontvangenBericht may already have been assigned

En zonder final zegt hij bij de connectbutton.settext()
Cannot refer to a non-final variable ontvangenBericht inside an inner class defined in a different method

Hij blijft met z'n oplossing in een cirkel draaien (neem final weg, voeg final toe, neem final weg, ..)

wat nu? :confused:
 
Een simpele oplossing is om de ontvangenBericht variabele als een class variabele te definieren.

Code:
private String ontvangenBericht = null;

Op de volgende link kan je hier de uitleg over vinden: http://stackoverflow.com/questions/...annot-be-used-inside-an-inner-class-and-inste

The difference is between local (method) variables vs class member variables. A member variable exists during the lifetime of the enclosing object, so it can be referenced by the inner class instance. A local variable, however, exists only during the method invocation, and is handled differently by the compiler, in that an implicit copy of it is generated as the member of the inner class. Without declaring the local variable final, one could change it, leading to subtle errors due to the inner class still referring to the original value of that variable.

Wel moet ik hierbij opmerken dat ik benieuwd ben wat er gebeurd als de variabele wordt aangepast voordat de handler klaar is met z'n post methode. De handler's post methode zet de taak (de runnable) namelijk in een queue (wachtrij) en voert deze uit indien hij er tijd voor krijgt van de processor. Indien je problemen ondervindt zul je elke keer een nieuwe string moeten aanmaken en deze meegeven in de run methode.
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan