与internet连接相关的Android异常
我的目标是通过android设备检索JSON。我用来实现这一点的代码如下:与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
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而不是字符串……希望它有所帮助