powered by simpleCommunicator - 2.0.41     © 2025 Programmizd 02
Форумы / Android [игнор отключен] [закрыт для гостей] / никак не получается alertdialog в потоке из под broadcastreceiver
10 сообщений из 10, страница 1 из 1
никак не получается alertdialog в потоке из под broadcastreceiver
    #38629533
evgen29
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день! Есть основное activity, в котором создается broadcastreceiver в mainactivity.oncreate.
MainActivity взаимодействует с сервером, который через Intent посылает в broadcastreceiver сообщения.
Дело в том, что я в broadcastreceiver взависимости от типа сообщения запускаю отдельный поток, в котором общаюсь с httptransportse с SOAP-сервер. тот присылает мне ответ, и я пытаюсь вывести сообщение в основном потоке MainActivity. Не ругается, но сообщение не видно.
Вот примерный код. Пробовал по разному. Результат один - ошибок нет, а сообщение не выводит Даже в логировании
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
public class MainActivity extends Activity {
    final String LOG_TAG = "myLogs";
    private VarsClass vc;
    private Handler mh;
    MyReceiver uiUpdated;
    private class MyReceiver extends BroadcastReceiver{
        private final Handler mahandler; // Handler used to execute code on the UI thread

        public MyReceiver(Handler handler) {
            this.mahandler = handler;
         
        }    	
        @Override
        public void onReceive(final Context context, final Intent intent) {
    	   Log.d(LOG_TAG, "receive in mainactivity done");		    	
    	   int resp=intent.getExtras().getInt("<MSG>");
    	   switch(resp){
	      case VarsClass.MSG_START_AUTH:{
         	 new Thread(new Runnable() {	    				   
    		    @Override
    		    public void run() {	
                       //...работа с SOAP
                       //............................
                       //шлем сообщение
                       Message mess = mahandler.obtainMessage(); 
	  	       Bundle b = new Bundle(); 
	  	       b.putString("TITLE", "Сообщение сервера"); 
	  	       b.putString("SERVERMSG", "ПРОБА"); 
	  	       mess.setData(b); 
	  	       mahandler.handleMessage(mess);        
                    }
                 }
              }
              //ДРУГИЕ CASE                   
           } 
        }
    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main);
       mh=new Handler() {
          public void handleMessage(Message msg) {
             final String title = msg.getData().getString("TITLE");
             final String servermsg = msg.getData().getString("SERVERMSG");
             Log.d(LOG_TAG, "showmessage");
             VarsClass.ShowSimpleDialog(
        	MainActivity.this, title, 
        	servermsg);                    
          }            
        };  
	uiUpdated = new MyReceiver(mh); // Create the receiver
        registerReceiver(uiUpdated, new IntentFilter("MAINACTIVITYMSG"));
     }
}



где
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
//ПРИ ОБЫЧНОМ ВЫЗОВЕ РАБОТАЕТ НОРМ
public class VarsClass {
    public static void ShowSimpleDialog(Context context,String title,String msg){
		AlertDialog.Builder builder = new AlertDialog.Builder(context);
		builder.setTitle(title)
				.setMessage(msg)
				.setIcon(R.drawable.ic_launcher)
				.setCancelable(false)
				.setNegativeButton("ОК",
						new DialogInterface.OnClickListener() {
							public void onClick(DialogInterface dialog, int id) {
								dialog.cancel();
							}
						});
		AlertDialog alert = builder.create();
		alert.show();    	
    }
     
}




Я уже и runonuithread в потоке пробовал и
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
	  				        	mahandler.post(new Runnable() {							
	  				        		@Override
	  				        		public void run() {
	  				        			// TODO Auto-generated method stub
	  				        			VarsClass.ShowSimpleDialog(
	  				        					MainActivity.this, "Ошибка", 
	  				        					emess); 
	  				        		}
	  				        	});	




ошибки нет,но сообщение не кажет (((. но showmesage в логе появляется
Помогите новичку в android
...
Рейтинг: 0 / 0
никак не получается alertdialog в потоке из под broadcastreceiver
    #38629721
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С английским дружишь? http://stackoverflow.com/questions/4844031/alertdialog-from-within-broadcastreceiver-can-it-be-done

Вкратце, чтоб все было красиво и функционально (как-бы сделал я):
1. Алерт вынести в отдельную прозрачную активити (по ссылке есть код).
2. Броадкаст так же вынести в отдельный класс и прописать его в манифесте.
...
Рейтинг: 0 / 0
никак не получается alertdialog в потоке из под broadcastreceiver
    #38629751
Фотография Джибс
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. вместо Thread я бы лучше использовал
http://developer.android.com/reference/android/os/AsyncTask.html


авторЯ уже и runonuithread в потоке пробовал



пока загадка для меня, вроде должно сработать было.

у меня подобные диалоги существовали.
...
Рейтинг: 0 / 0
никак не получается alertdialog в потоке из под broadcastreceiver
    #38629823
evgen29
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
wadmanС английским дружишь? http://stackoverflow.com/questions/4844031/alertdialog-from-within-broadcastreceiver-can-it-be-done

Вкратце, чтоб все было красиво и функционально (как-бы сделал я):
1. Алерт вынести в отдельную прозрачную активити (по ссылке есть код).
2. Броадкаст так же вынести в отдельный класс и прописать его в манифесте.

а не в курсе, почему ошибки нет, а диалог не выводится? Не сталкивались с таким?Ведь скрипт доходит до показа диалога, но ошибки то нет...
...
Рейтинг: 0 / 0
никак не получается alertdialog в потоке из под broadcastreceiver
    #38629860
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
evgen29, в курсе .
А Джибс лукавит. )

Receiver LifecycleA BroadcastReceiver object is only valid for the duration of the call to onReceive(Context, Intent). Once your code returns from this function, the system considers the object to be finished and no longer active.

This has important repercussions to what you can do in an onReceive(Context, Intent) implementation: anything that requires asynchronous operation is not available, because you will need to return from the function to handle the asynchronous operation, but at that point the BroadcastReceiver is no longer active and thus the system is free to kill its process before the asynchronous operation completes.

In particular, you may not show a dialog or bind to a service from within a BroadcastReceiver. For the former, you should instead use the NotificationManager API. For the latter, you can use Context.startService() to send a command to the service.
...
Рейтинг: 0 / 0
никак не получается alertdialog в потоке из под broadcastreceiver
    #38629871
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
То есть ресивер должен максимально быстро отработать, где-то ему дается максимум 10 секунд, где-то - 20. Потом ресивер прибивается, потому никаких диалогов, где придется ожидать реакцию пользователя.
...
Рейтинг: 0 / 0
никак не получается alertdialog в потоке из под broadcastreceiver
    #38629993
evgen29
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Простите меня, нашёл ошибку.
В общем дело в том, что у меня MainActivity является основной Activity, которая выводит сообщения сервера, обращается к серверу, работает с Service и запускает другие Activity. Так вот, у меня была запущена другая Activity, требующая авторизацию, и при нажатии кнопки ok я не закрывал её через finish(), соответственно диалог создавался в отдельном потоке нормально с контекстом MainActivity, который перекрывался моим AuthActivity - создавался нормально, но был перекрыт. Поэтому всё вышеописанное работает нормально, виновата только моя невнимательность и отсутствие практического опыта. Всем спасибо за ответы.
...
Рейтинг: 0 / 0
никак не получается alertdialog в потоке из под broadcastreceiver
    #38630007
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все равно странно...
evgen29в котором общаюсь с httptransportse с SOAP-сервер
Это удаленный сервер? Он может ответить в то время, когда телефон "спит"? Что в таком случае произойдет?
...
Рейтинг: 0 / 0
никак не получается alertdialog в потоке из под broadcastreceiver
    #38630015
evgen29
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
wadmanВсе равно странно...
evgen29в котором общаюсь с httptransportse с SOAP-сервер
Это удаленный сервер? Он может ответить в то время, когда телефон "спит"? Что в таком случае произойдет?
пока не знаю, этого вопроса не касался, решаю вопросы по ходу создания функционала в рамках разработанной модели взаимодействия.
...
Рейтинг: 0 / 0
никак не получается alertdialog в потоке из под broadcastreceiver
    #38630021
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
evgen29wadmanВсе равно странно...
пропущено...

Это удаленный сервер? Он может ответить в то время, когда телефон "спит"? Что в таком случае произойдет?
пока не знаю, этого вопроса не касался, решаю вопросы по ходу создания функционала в рамках разработанной модели взаимодействия.
Попался! Говорю же, сразу делай как правильно.

Нужна для этого отдельная активити, у которой выставлены флаги

Код: java
1.
2.
3.
4.
5.
@Override
    public void onAttachedToWindow() {
        this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON,
                WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
    }



И стартовать её с флагами
Код: java
1.
Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_NEW_TASK

из броадкаста. Сообщение/параметры можно передать через intent.putExtra. И будет все по феншую.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Android [игнор отключен] [закрыт для гостей] / никак не получается alertdialog в потоке из под broadcastreceiver
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]