AlertDialog in anderer Class (AsyncTask)

M

mitch_HD2

Fortgeschrittenes Mitglied
1
Ich sitze schon den ganzen Abend dran, habe jede menge ausprobiert aber nichts funkioniert


SendReceive.java
Code:
public class SendReceive{

public static Context c;
	public SendReceive(Context context) {
		c = context;
		// TODO Auto-generated constructor stub
	}
...
public static class Send extends AsyncTask<String, Void, Void> {
		@SuppressWarnings("deprecation")
		@Override
		protected Void doInBackground(String... arg0) {
			Socket socket = null;
			try {
.....
catch (ConnectException e){
 AlertDialog.Builder builder = new AlertDialog.Builder(c);
		        // builder.setTitle("Title");
		        builder.setTitle("GA");
		        // builder.setIcon(R.drawable.alert_36);

		        builder.setMessage("A");

		        builder.setCancelable(false);
		        builder.setNegativeButton("OK", new DialogInterface.OnClickListener() {
		            public void onClick(DialogInterface dialog, int id) {
		                dialog.cancel();

		            }

		        });

		        AlertDialog alert = builder.create();
		        alert.show();			

....

MainActivity.java
Code:
public class MainActivity extends Activity implements OnClickListener{
....
SendReceive sendReceive = new SendReceive(this);

was mache ich Falsch? LogCat sagt..

Code:
12-12 21:24:38.270: E/AndroidRuntime(1484): FATAL EXCEPTION: AsyncTask #1
12-12 21:24:38.270: E/AndroidRuntime(1484): java.lang.RuntimeException: An error occured while executing doInBackground()
12-12 21:24:38.270: E/AndroidRuntime(1484): 	at android.os.AsyncTask$3.done(AsyncTask.java)
12-12 21:24:38.270: E/AndroidRuntime(1484): 	at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java)
12-12 21:24:38.270: E/AndroidRuntime(1484): 	at java.util.concurrent.FutureTask.setException(FutureTask.java)
12-12 21:24:38.270: E/AndroidRuntime(1484): 	at java.util.concurrent.FutureTask.run(FutureTask.java)
12-12 21:24:38.270: E/AndroidRuntime(1484): 	at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java)
12-12 21:24:38.270: E/AndroidRuntime(1484): 	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java)
12-12 21:24:38.270: E/AndroidRuntime(1484): 	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java)
12-12 21:24:38.270: E/AndroidRuntime(1484): 	at java.lang.Thread.run(Thread.java)
12-12 21:24:38.270: E/AndroidRuntime(1484): Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
12-12 21:24:38.270: E/AndroidRuntime(1484): 	at android.os.Handler.<init>(Handler.java)
12-12 21:24:38.270: E/AndroidRuntime(1484): 	at android.os.Handler.<init>(Handler.java)
12-12 21:24:38.270: E/AndroidRuntime(1484): 	at android.app.Dialog.<init>(Dialog.java)
12-12 21:24:38.270: E/AndroidRuntime(1484): 	at android.app.AlertDialog.<init>(AlertDialog.java)
12-12 21:24:38.270: E/AndroidRuntime(1484): 	at android.app.AlertDialog$Builder.create(AlertDialog.java)
12-12 21:24:38.270: E/AndroidRuntime(1484): 	at home.control.SendReceive$Send.doInBackground(SendReceive.java:102)
12-12 21:24:38.270: E/AndroidRuntime(1484): 	at home.control.SendReceive$Send.doInBackground(SendReceive.java:1)
12-12 21:24:38.270: E/AndroidRuntime(1484): 	at android.os.AsyncTask$2.call(AsyncTask.java)
12-12 21:24:38.270: E/AndroidRuntime(1484): 	... 5 more
 
Ich vermute, dass der AlertDialog$Builder nur UI Thread funktioniert.

ich würde es mit einem Interface lösen...
Code:
public interface AlertDialogDisplayer {

	public void showAlert(String title, String message);

}

Deine MainActivity muss dieses Interface dann Implementieren:

Code:
public class MainActivity extends Activity implements OnClickListene, AlertDialogDisplayer {

   ...

   public void showAlert(String title, String message) {
      AlertDialog.Builder builder = new AlertDialog.Builder(this);
      builder.setTitle(title);
      builder.setMessage(message);
      // und so weiter...
   }

}

Jetzt muss dein ASynctask nur noch wissen, dass deine Activity das Interface implementiert. Leider kann ich aus dem Code Ausschnitt nicht nachvollziehen, warum du Send als innere Klasse von SendReciever programmiert hast und ob SendReciever noch irgendwas macht außer den Context zu halten. Falls SendReciever nichts anderes mit dem Context macht, könntest du den Construktor so verändern:

Code:
public static AlertDialogDisplayer displayer;
public SendReceive(AlertDialogDisplayer displayer) {
	this.displayer = displayer;
}

und wenn du dann einen Dialog in der UI anzeigen willst, rufst du in deinem ASyncTask displayer.showAlert("Title", "Ich bin eine Dummy Nachricht"): auf.

p.s.

wenn du code im Forum postest, nimm auskommentierten Code bitte ganz raus, das macht es für die anderen leserlicher.

p.p.s.

Code:
@SuppressWarnings("deprecation")
ich weis nicht was du da benutzt, aber guck, ob du nicht was anderes findest.
 
Zuletzt bearbeitet:
Hi
erstmal danke dafür, aber leider funktioniert auch dies nicht!

Code:
12-14 19:31:32.960: E/AndroidRuntime(28680): FATAL EXCEPTION: AsyncTask #1
12-14 19:31:32.960: E/AndroidRuntime(28680): java.lang.RuntimeException: An error occured while executing doInBackground()
12-14 19:31:32.960: E/AndroidRuntime(28680): 	at android.os.AsyncTask$3.done(AsyncTask.java)
12-14 19:31:32.960: E/AndroidRuntime(28680): 	at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java)
12-14 19:31:32.960: E/AndroidRuntime(28680): 	at java.util.concurrent.FutureTask.setException(FutureTask.java)
12-14 19:31:32.960: E/AndroidRuntime(28680): 	at java.util.concurrent.FutureTask.run(FutureTask.java)
12-14 19:31:32.960: E/AndroidRuntime(28680): 	at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java)
12-14 19:31:32.960: E/AndroidRuntime(28680): 	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java)
12-14 19:31:32.960: E/AndroidRuntime(28680): 	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java)
12-14 19:31:32.960: E/AndroidRuntime(28680): 	at java.lang.Thread.run(Thread.java)
12-14 19:31:32.960: E/AndroidRuntime(28680): Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
12-14 19:31:32.960: E/AndroidRuntime(28680): 	at android.os.Handler.<init>(Handler.java)
12-14 19:31:32.960: E/AndroidRuntime(28680): 	at android.os.Handler.<init>(Handler.java)
12-14 19:31:32.960: E/AndroidRuntime(28680): 	at android.app.Dialog.<init>(Dialog.java)
12-14 19:31:32.960: E/AndroidRuntime(28680): 	at android.app.AlertDialog.<init>(AlertDialog.java)
12-14 19:31:32.960: E/AndroidRuntime(28680): 	at android.app.AlertDialog$Builder.create(AlertDialog.java)
12-14 19:31:32.960: E/AndroidRuntime(28680): 	at home.control.MainActivity.showAlert(MainActivity.java:489)
12-14 19:31:32.960: E/AndroidRuntime(28680): 	at home.control.Send.doInBackground(Send.java:80)
12-14 19:31:32.960: E/AndroidRuntime(28680): 	at home.control.Send.doInBackground(Send.java:1)
12-14 19:31:32.960: E/AndroidRuntime(28680): 	at android.os.AsyncTask$2.call(AsyncTask.java)
12-14 19:31:32.960: E/AndroidRuntime(28680): 	... 5 more

habe den Asynctask jetzt auch mal als seperate class gemacht, aber das war nix.

Code:
public class Send extends AsyncTask<String, Void, Void> {
	
	
	public interface AlertDialogDisplayer {

		public void showAlert(String title, String message);

	}
	
	
	public static AlertDialogDisplayer displayer;
	
	public Send(AlertDialogDisplayer displayer) {
		this.displayer = displayer;
	}
...
...

	protected Void doInBackground(String... arg0) {
		Socket socket = null;
		try {
			socket = new Socket(Connection.ipInt, Connection.Port);
			socket.setSoTimeout(3000);
		
 		/*****SEND BYTE TO SERVER******/
			DataOutputStream out = new DataOutputStream(new DataOutputStream(socket.getOutputStream()));
			out.write(SendByte);
			out.flush();
			Log.d("Udp sende", Arrays.toString(SendByte));
			
			/*****READ BYTE FROM SERVER*****/
			DataInputStream in = new DataInputStream(new DataInputStream(socket.getInputStream()));
			in.read(bufRec);
            System.out.println("Read Byte: "+ Arrays.toString(bufRec));
            in.close();
		}catch (ConnectException e){
			displayer.showAlert("titel", "HALLO");
			e.printStackTrace();
		}

MainActivitiy
Code:
public class MainActivity extends Activity implements OnClickListener, AlertDialogDisplayer{
...


...

public void showAlert(String titel, String message) {

        TextView title = new TextView(this);
        title.setText("Title");
        title.setPadding(10, 10, 10, 10);
....
}


Der ursprüngliche Beitrag von 19:38 Uhr wurde um 19:55 Uhr ergänzt:

Okay... hab den Fehler gefunden.. aber keine Lösung!!!

Send
Code:
	Activity activity;
	public Send(Activity activity){
		this.activity = activity;
	}

protected void onPreExecute(){
		MainActivity.showAlert(activity, "HALLO");
		super.onPreExecute();
		progressDialog = ProgressDialog.show(c,"Bitte Warten","Sende...", true);
	}
das funktioniert!!!

mache ich mein showAlert aber in
catch (ConnectException e){

e.printStackTrace();
} rein, läuft es nicht mehr
 
Ja sorry habe ich verpeilt:

du musst mit onProgressUpdate und publishProgress arbeiten:

du musst den Wert für Progressupdate auf String stellen (ist zur zeit void bei dir:
Code:
public class Send extends AsyncTask<String, String, Void> {
...

dann die Methode onProgressUpdate überschreiben und dort die showAlert methode aufrufen:

Code:
protected void onProgressUpdate(String... progress) {
         if (progress.length() == 2) {
              displayer.showAlert(progress[0], progress[1]);
         }
     }

und in der DoInBackground Methode rufst du dann publishProgress auf:

Code:
	protected Void doInBackground(String... arg0) {
		//...
		publishProgress("Titel", "Ich bin eine Dummynachricht");
 
Hej sorry für das späte feedback.. wollte nur sagen dass es so funktioniert hat:) viel dank!!!! und frohes fest;)
 

Ähnliche Themen

J
  • Juleru
Antworten
8
Aufrufe
506
Juleru
J
D
Antworten
23
Aufrufe
2.649
Data2006
D
OnkelLon
Antworten
13
Aufrufe
2.011
OnkelLon
OnkelLon
Zurück
Oben Unten