Zabijanie activity

0

Witam mam pewien problem.
Pisze aplikacje na android i chodzi mi o to że by instrukcja Try wyłapała błąd w metodzie przypisz_kursy() jeśli taki wystąpi wyświetliła komunikat "Problem z aktualizacją" i zabiła activity lecz program wyłapuje wyjątek wyświetla komunikat "Problem z aktualizacją" później jeszcze ten :"Zaktualizowano" (którego nie powinien) i dopiero aktywność zostaje zabita.

 
			try 
			{
				przypisz_kursy();
			} 
			catch (Exception e) 
			{
	   	        Toast.makeText(getApplicationContext(),"Problem z aktualizacją", Toast.LENGTH_SHORT).show();
				super.onDestroy();
			}	
		    Toast.makeText(getApplicationContext(),"Zaktualizowano", Toast.LENGTH_SHORT).show();
			super.onDestroy();	
0

Wchodzi do catch, wykonuje to co tam jest a potem wychodzi i robi to co jest dalej w programie więc wypisuje "Zaktualizowano" bo program nie kończy się po złapaniu wyjątku.

0

Wydawało mi się że metoda super.onDestroy() powinna zabić od razu aktywność.

0

Nie wiem jak ta metoda działa. Natomiast wydaje mi się, że po wyjściu z catch program będzie działał dalej. Ewentualnie zastąp to if... then... else chociaż nie wiem czy to najlepsze wyjście.

0

onDestroy jak i inne callbacki (onResume itp.) nie sa od tego zebys ty je wolal, je wola system. Wymuszenie zakonczenia Activity robisz np. za pomoca finish().

0

Próbowałem też z finish() i to samo

0

Nie wywołauj onDestroy() tylko finish() jak wspomniano wyżej, oraz dodaj return'a po finish().

0

Tylko ja to wykonuje w OnCreate() a a ona jest typu void.
Kod całej metody:

 @Override
	    public void onCreate(Bundle savedInstanceState) 
	    {
	        super.onCreate(savedInstanceState);
	        setContentView(R.layout.aktual);
			zapisane_ustawienia=getSharedPreferences("MyPreferences",Activity.MODE_PRIVATE);
			new Thread(new Runnable() 
    		{
    	        public void run() 
    	        {
                    try 
                    {
				        pobierz();
				    } 
                    catch (Exception e) 
				    {
				    }               	       
                 }
    	      }).start();
			try 
			{
				przypisz_kursy();
			} 
			catch (Exception e) 
			{
	   	                Toast.makeText(getApplicationContext(),"Problem z aktualizacją", Toast.LENGTH_SHORT).show();
				finish();
			//	return();
			}	
		   
				Toast.makeText(getApplicationContext(),"Zaktualizowano", Toast.LENGTH_SHORT).show();
			finish();	     
	    }    
 
0

Nie patrzylem na kod, ale sam fakt ze robisz to w onCreate smierdzi. Czyli jak - ktos uruchamia aplikacje / activity, onCreate costam robi i jesli sie nie powiedzie, jest konczone? Pomijam, ze nie jestem pewien co na to Android jesli w onCreate wywolasz onDestroy / finish czy inne - uzytkownik nie dostaje zadnego komunikatu ani nic, i aplikacja / activity sie konczy? Srednie usability - lepiej jak jest blad to chociaz pokaz ze sie cos nie powiodlo i moze rowniez dlaczego?

0

@dawid918 To, że jest void nie znaczy ze nie może być return ;) Próbowałeś dodać? Jeśli takie rozwiązanie Ci się nie podoba zawsze możesz jakąś flagę ustawić.

0

śmieszne jest to pytanie

try 
            {
                przypisz_kursy();
               Toast.makeText(getApplicationContext(),"Zaktualizowano", Toast.LENGTH_SHORT).show();
            } 
            catch (Exception e) 
            {
                   Toast.makeText(getApplicationContext(),"Problem z aktualizacją", Toast.LENGTH_SHORT).show();
            }    
            super.onDestroy();  
0

Dobra zrobiłem to trochę po swojemu i działa.

 
public void onCreate(Bundle savedInstanceState) 
	    {
	        super.onCreate(savedInstanceState);
	        setContentView(R.layout.aktual);
			zapisane_ustawienia=getSharedPreferences("MyPreferences",Activity.MODE_PRIVATE);
			new Thread(new Runnable() 
    		{
    	        public void run() 
    	        {
                    try 
                    {
				        pobierz();
				    } 
                    catch (Exception e) 
				    {
				    }               	       
                 }
    	      }).start();
			try 
			{
				przypisz_kursy();
			} 
			catch (Exception e) 
			{
				text="Problem z aktualizacją";
			}	

			Toast.makeText(getApplicationContext(),text, Toast.LENGTH_SHORT).show();
			finish();	     
	    }    

Ale @bolson miałeś racje wystarczyło dać return i też działa, szczerze to nawet o tym nie pomyślałem żeby dać return do Void-a :D
Jeszcze dużo nauki przede mną :D
Dzieki za pomoc wszystko ładnie działa.
A przy to tu wszystko jest w OnCreate bo to ma się tylko wykonać bez żadnej integracji użytkownika, pobiera aktualne kursy walut ze strony internetowej i zapisuje do sharedPreferences i wyswietla tylko komunikat czy się powiodło czy nie.

0

Wiem czytałem o tym, ale na razie wystarczą mi zwykłe wątki :)

  • nie, nie starczą a wręcz nie wolno ich stosować w takiej formie (najlepiej wcale i użyć jakiejś dobrej bliboteki, np. retrofit, robospice, volley). Prosty przykład, otwierasz kilka razy i zamykasz taką aktywność jak napisałeś. Przed zamknięciem nie zdąży się wykonać kod odpowiedzialny za pobranie danych. Masz wyciek pamięci. Dodaj do tego jeszcze jakieś ładowanie bitmapy i po kilku obrotach możesz się pożegnać z aplikacją.
0

prawidłowym rozwiązaniem jest usługa (service)! Ludzie ogólnie mają zły zwyczaj pakowania wszystkiego do Activity zamiast jedynie zarządzać tam UI-jem.

  • np. robospice korzysta z serwisu. Jak nie jest się doświadczonym developerem to zabawa z serwisami raczej dobrze się nie kończy. Trochę niepoważne jest też implementowanie czegoś nad czym społeczność pracuje od dłuższego czasu i co działa niezawodnie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1