Java 使用Gson(Android)发布

Java 使用Gson(Android)发布,java,android,json,gson,emulation,Java,Android,Json,Gson,Emulation,我是Android新手,我正在学习一个关于如何使用Gson的教程。 () 我已尝试接收以下json对象。 () 这是我的代码: 主要类别: public class MainActivity extends Activity { String url = "http://api.openweathermap.org/data/2.5/weather?q=London,uk"; @Override protected void onCreate(Bundle savedInstanceSta

我是Android新手,我正在学习一个关于如何使用Gson的教程。 ()

我已尝试接收以下json对象。 ()

这是我的代码:

主要类别:

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;

}}
天气等级:

public class Weather {

public double lon;

public double lat;

public String country;

public int speed;

@SerializedName("all")
public int clouds;
}
如果我在模拟器上运行此操作,我的应用程序“不幸已停止”,LogCat会这样说:

我在stackoverflow上发现了很多关于gson的问题,但没有解决我的问题。
那么我做错了什么???

您正在主线程内执行网络操作。你不应该这样做,因为你可以阻止你的UI。Android会警告您并抛出
NetworkOnMainThreadException
。在工作线程上执行网络操作。如果要使用网络操作的结果来更新UI,可以使用
AsyncTask
。如果您不需要更新UI,只需创建一个新线程并在那里执行网络操作。

您正在主线程中创建/启动internet请求。我尝试了异步,效果很好,谢谢!!!我很高兴能帮上忙。如果你不介意的话,也请投赞成票。