Android - gdzie szukać błędów z catcha?

0

Próbuję zmusić moją aplikację androidową aby pobierała dane przez HTTP i parsowała je Gsonem. Wiem, że kod działa bo mam inny projekt, który przy drobnych (na moje oko nieistotnych zmianach) działa dobrze. W mojej aplikacji teraz problem leży w HttpResponse getResponse = client.execute(getRequest);, który coś ode mnie chce.
I tu jest problem, nie wiem co.

Próbuję wrzucać przeróżne rzeczy w catch, ale z uporem maniaka Logcat czy konsola milczą. A nawet i bez tego milczą gdy aplikacja zalicza zgon. Moje pytanie brzmi... co robię źle? Jak mam zrobić aby coś mi się wyświetlało w konsoli gdy aplikacja mi się posypie?

Dla porządku wrzucę też właściwy kod, może przy okazji rzuci wam się w oczy mój błąd.
Uruchamiam kod tak:

package com.example.userlogin;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends Activity {
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		new RetrieveHTTP(this, URL).execute();
		
		
		testLaunch();
	}
		
}
package com.example.userlogin;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;

import com.google.gson.Gson;

import android.content.Context;
import android.os.AsyncTask;
import android.util.Log;
import android.widget.Toast;

public class RetrieveHTTP extends AsyncTask<String, Void, InputStream> {
	
	String url = "link do jsona";
	Context c;

    public RetrieveHTTP(Context c, String url) {
          this.c = c;
          //this.url = url;
     }
	

    protected InputStream doInBackground(String... urls) {
    	
		DefaultHttpClient client = new DefaultHttpClient();

		HttpGet getRequest = new HttpGet(url);

		try {
			
			HttpResponse getResponse = client.execute(getRequest); //TO SPRAWIA PROBLEMY
			final int statusCode = getResponse.getStatusLine().getStatusCode();

			if (statusCode != HttpStatus.SC_OK) {
				Log.w(getClass().getSimpleName(), "Error " + statusCode + " for URL " + url);
				return null;
			}

			HttpEntity getResponseEntity = getResponse.getEntity();
			return getResponseEntity.getContent();
			
		} catch (ClientProtocolException e) {
			Log.e("Error: ",Log.getStackTraceString(e));
		} catch (IOException e) {
			Log.e("Error: ",Log.getStackTraceString(e));
		} catch (IllegalStateException e) {
			Log.e("Error: ",Log.getStackTraceString(e));
		} 
		
		return null;
    	
    }
    
	private void feedGsonWithHTTP(InputStream source) {
		try {
			Gson gson = new Gson();
			Reader reader = new InputStreamReader(source);
			// SearchResponse response = gson.fromJson(reader,
			// SearchResponse.class);
			// List<Result> results = response.objects;
			// Result r = results.get(0);
			// String s = r.firstName;
		} catch (Exception e) {
			Log.e("Error: ", Log.getStackTraceString(e));
		}
		Toast.makeText(c, "yay", Toast.LENGTH_LONG).show();

	}
	
    protected void onPostExecute(InputStream result){
    	feedGsonWithHTTP(result);
    }

w feedGsonWithHTTP połowa jest wykomentowana bowiem już Reader się wysypuje. Ergo - source jest złe. Ergo - poprzednia metoda coś miesza.
Aha, z góry odpowiadając - mianfest mam.

0
  1. Błędów z catcha szukaj w logcacie.
  2. W nowych aplikacjach nie korzysta się z async-task. Proponuję użyć do tego biblioteki, np. retrofit.
0

I jak zwykle chwilę po tym jak napisałem posta - udało mi się rozwiązać problem. Należało zrestartować Eclipse'a.
Odzyskałem konsolę. Super.

Problem okazuje się być błahy, admin pozmieniał rzeczy i nie poprawił instrukcji, przez co próbowałem logować nieistniejącego usera.
Zamiast:
{ "status": "OK" }

Otrzymywałem:
{ "status": "ERROR", "message": "No user with id: 5629499534213120" }

W konsoli pokazywało to jako błąd 400 (albo przy innej próbie 500), przeskakiwało do return null; i przez to Reader musiał pracować na niczym.

Ale... czy ten status przypadkiem tak czy inaczej nie powinien być przekazywany mi Jsonem do późniejszego wglądu?
W tej chwili mam działającą aplikację. Gdy podaję działający link - super.
Gdy podaję zepsuty - crash.

0

Wywal eclipse. Do androida tylko i wyłącznie android studio (chyba, że chcesz się kiedyś rozpłakać i przy okazji osiwieć). Co do statusów, nie wiem, ja api nie robię. Pisałem wyżej, korzystanie z async-task to BARDZO ZŁA decyzja.

0

Rozumiem, że retrofit użyty z Activity jest powiązany z jej lifecycle i jeśli chce się pobierać większe pliki przez internet lub pozwalać na zmianę orientacji, to trzeba korzystać z retrofit w połączeniu z Service? Trochę googlałem w czym jest on lepszy od AsyncTask i piszą, że główna różnica to możliwość wykonywania kilku połączeń z internetem równocześnie. Jeszcze jakieś są? Obecnie używam AQuery. Jeśli nie jest to kolejne AQuery, to raczej nie warto się przenosić, ewentualnie na RoboSpice https://github.com/stephanenicolas/robospice

0

Robospice ma specjalne rozszerzenie dla retrofit, takie połączenie jest bardzo stabilne, więc je polecam (przede wszystkim nie martwisz się lifecycle activity i fragmentów). https://github.com/octo-online/RoboSpice-samples/tree/release/robospice-sample-retrofit
AQuery jest świetne do ładowania obrazów (nie znalazłem do tej pory szybszej biblioteki), do http też jest dobra (i również nie martwisz się o lifecycle). Przy korzystaniu z asynctask, wystarczy że zamkniesz aktywność przed odpowiedzią z serwera i masz 100% aplikacja przestała działać, dodatkowo na różnych urządzeniach różnie to działa (na starszych może zostać odpalonych wiele async-task jednocześnie, na nowszych wykonują się po kolei). O wadach async-task można by tak jeszcze przez godzinę.

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