2014-12-10 3 views
1

Я новичок в Android, и я следил за учебником о том, как использовать Gson. (http://www.javacodegeeks.com/2011/01/android-json-parsing-gson-tutorial.html)Проблема с использованием Gson (Android)

Я попытался получить следующий объект json. (http://api.openweathermap.org/data/2.5/weather?q=London,uk)

Это мой код:

MainClass:

public class MainActivity extends Activity { 


String url = "http://api.openweathermap.org/data/2.5/weather?q=London,uk"; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    InputStream source = retrieveStream(url); 
    Gson gson = new Gson(); 
    Reader reader = new InputStreamReader(source); 
    Weather weather = gson.fromJson(reader, Weather.class); 
    Toast.makeText(this, weather.clouds, Toast.LENGTH_SHORT).show(); 

} 

private InputStream retrieveStream(String url) { 

    DefaultHttpClient client = new DefaultHttpClient(); 
    HttpGet getRequest = new HttpGet(url); 
    try { 

     HttpResponse getResponse = client.execute(getRequest); 
     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 (IOException e) { 
     getRequest.abort(); 
     Log.w(getClass().getSimpleName(), "Error for URL " + url, e); 
    } 

    return null; 

}} 

WeatherClass:

public class Weather { 

public double lon; 

public double lat; 

public String country; 

public int speed; 

@SerializedName("all") 
public int clouds; 
} 

Если я бегу это на эмуляторе, мой App "к сожалению, остановил" и LogCat говорят об этом:

enter image description here

enter image description here

Я нашел много о проблемах gson на StackOverflow, но ничего не решить мою проблему. Так что я делаю неправильно?

+0

Вы создаете/инициируете интернет-запрос в mainThread. –

ответ

1

Выполнение операций в сети внутри основного потока. Вы не должны этого делать, потому что можете заблокировать свой пользовательский интерфейс. Android предупреждает вас об этом и бросает NetworkOnMainThreadException. Выполнять сетевую операцию в рабочем потоке. Вы можете использовать AsyncTask для этого, если вы хотите использовать результаты своей сетевой операции для обновления интерфейса. Если вам не нужно обновлять свой интерфейс, просто создавайте новый поток и делайте там сетевой материал.

+0

Я пробовал его асинхронно, и он отлично работает, спасибо !!! – Sasch

+0

Я счастлив, что смогу помочь. Пожалуйста, проголосуйте также, если вы не возражаете. –

Смежные вопросы