与internet连接相关的Android异常

与internet连接相关的Android异常,android,json,Android,Json,我的目标是通过android设备检索JSON。我用来实现这一点的代码如下: public JSONObject getJSONFromUrl(String url) { // Making HTTP request try { // defaultHttpClient DefaultHttpClient httpClient = new DefaultHttpClient(); HttpPost httpPost = new H

我的目标是通过android设备检索JSON。我用来实现这一点的代码如下:

 public JSONObject getJSONFromUrl(String url) {

    // Making HTTP request
    try {
        // defaultHttpClient
        DefaultHttpClient httpClient = new DefaultHttpClient();
        HttpPost httpPost = new HttpPost(url);

        HttpResponse httpResponse = httpClient.execute(httpPost);
        HttpEntity httpEntity = httpResponse.getEntity();
        is = httpEntity.getContent();           

    }
不幸的是,由于无法成功连接到Internet,我在HttpResponse线路上收到以下错误:

java.lang.runtimeexception无法启动活动组件信息:android.os.Network

我在Stackoverflow的其他线程中读到,一个可能的解决方案是启动一个新线程。但我不知道怎么做

另外,我已经在androidmanifest.xml中声明了internet权限行,即

<uses-permission android:name="android.permission.INTERNET" />

这是我编写的一个类,用于从服务器(Google app engine)查询数据,它建立连接并联机读取内容

public class QueryServer 
{ 
    public static final String URL = "http://10.0.2.2:8888/";

@SuppressWarnings("unused")
private class GetXMLTask extends AsyncTask<String, Void, String>
{
    @Override
    protected String doInBackground(String... urls)
    {           
        String output = null;           
        try
        {               
             for (String url : urls) 
             {                      
                output = getOutputFromUrl(url); 
                Log.d("Server Return", output);
             }               
        }
        catch(Exception e)
        {
            Log.d("Exception", e.getMessage());
        }
        return output;
    }           
  } 
  private String getOutputFromUrl(String url)
  {
        StringBuffer output = new StringBuffer("");
        try 
        {
            InputStream stream = getHttpConnection(url);
            BufferedReader buffer = new BufferedReader(new InputStreamReader(stream));
            String s = "";
            while ((s = buffer.readLine()) != null)
            {
                output.append(s);
                output.toString();
            }
        }
        catch (IOException e1) 
        {
            e1.printStackTrace();
        }

        return output.toString();
    } 
    // Makes HttpURLConnection and returns InputStream
    private InputStream getHttpConnection(String urlString) throws IOException 
    {
        InputStream stream = null;
        try 
        {                
            java.net.URL url = new java.net.URL(urlString);
            URLConnection connection = url.openConnection();      
            HttpURLConnection httpConnection = (HttpURLConnection) connection;
            httpConnection.setRequestMethod("GET");
            httpConnection.connect();

            if (httpConnection.getResponseCode() == HttpURLConnection.HTTP_OK) 
            {
                stream = httpConnection.getInputStream();
            }
        } 
        catch (Exception ex) 
        {
            ex.printStackTrace();
        }
        return stream;
    } 
    protected void onPostExecute(String output) 
    {

    }
}
公共类查询服务器
{ 
公共静态最终字符串URL=”http://10.0.2.2:8888/";
@抑制警告(“未使用”)
私有类GetXMLTask扩展了AsyncTask
{
@凌驾
受保护的字符串doInBackground(字符串…URL)
{           
字符串输出=null;
尝试
{               
for(字符串url:url)
{                      
输出=getOutputFromUrl(url);
Log.d(“服务器返回”,输出);
}               
}
捕获(例外e)
{
Log.d(“异常”,例如getMessage());
}
返回输出;
}           
} 
私有字符串getOutputFromUrl(字符串url)
{
StringBuffer输出=新的StringBuffer(“”);
尝试
{
InputStream=getHttpConnection(url);
BufferedReader buffer=新的BufferedReader(新的InputStreamReader(流));
字符串s=“”;
而((s=buffer.readLine())!=null)
{
输出。追加;
output.toString();
}
}
捕获(IOE1异常)
{
e1.printStackTrace();
}
返回output.toString();
} 
//建立HttpURLConnection并返回InputStream
私有InputStream getHttpConnection(字符串urlString)引发IOException
{
InputStream=null;
尝试
{                
java.net.URL URL=新的java.net.URL(urlString);
URLConnection=url.openConnection();
HttpURLConnection httpConnection=(HttpURLConnection)连接;
setRequestMethod(“GET”);
httpConnection.connect();
if(httpConnection.getResponseCode()==HttpURLConnection.HTTP\u确定)
{
stream=httpConnection.getInputStream();
}
} 
捕获(例外情况除外)
{
例如printStackTrace();
}
回流;
} 
受保护的void onPostExecute(字符串输出)
{
}
}
试试这个

public JSONObject getJSONFromUrl(String url) {
                 JSONObject j = null;
        // Making HTTP request
        try {
            // defaultHttpClient
            HttpParams httpParameters = new BasicHttpParams();
            HttpClient httpClient = new DefaultHttpClient(httpParameters);
            HttpPost httpPost = new HttpPost(url);

            HttpResponse httpResponse = httpClient.execute(httpPost);
            //HttpEntity httpEntity = httpResponse.getEntity();
           // is = httpEntity.getContent(); 
            j = new JSONObject(EntityUtils.toString(httpResponse.getEntity()));

        }finally{
                     return j;
                }
}

如果您无法连接到网络,您的异常情况有什么问题?只需以某种方式处理它-给用户重试等选项。如果您在主UI线程上运行该代码,您需要在Android上更多地阅读异步编程。ASyncTask是一个帮助器类,它(在后台)为您创建一个新线程,但使您不必真正了解线程。看见不过,您确实需要了解JavaGereric的情况;o) 你试过把代码嵌入AsyncTask类吗?我是android的新手。所以不,我没有试过。有人能给出一些指导吗?你应该发布你的异常的完整堆栈跟踪(在这种情况下,至少包括内部异常)。此外,如果这确实是一个
NetworkOnMainThreadException
问题,那么还有许多其他StackOverflow问题和答案可以与
AsyncTask
一起解决这个问题。由于您使用的是JSON,请将“getOutputFromUrl”方法声明为JSON而不是字符串……希望它有所帮助