使用 android 上的 HTTPURL 连接从 URL 获取 JSON 对象
Get JSON object from URL using HTTPURLConnection on android
我目前正在尝试访问我的 android 应用程序上的 JSON 对象。但是,我不断收到以下错误:
android.os.NetworkOnMainThreadException
通过稍微研究一下,我目前唯一的信息是我需要异步执行此操作(?)
这是我的代码:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView dynamictext;
dynamictext = (TextView) findViewById(R.id.dynamictext);
dynamictext.setText(getJSON("my url here"));
}
public String getJSON(String url) {
HttpURLConnection c = null;
try {
URL u = new URL(url);
c = (HttpURLConnection) u.openConnection();
c.connect();
int status = c.getResponseCode();
switch (status) {
case 200:
case 201:
BufferedReader br = new BufferedReader(new InputStreamReader(c.getInputStream()));
StringBuilder sb = new StringBuilder();
String line;
while ((line = br.readLine()) != null) {
sb.append(line+"\n");
}
br.close();
return sb.toString();
}
} catch (Exception ex) {
return ex.toString();
} finally {
if (c != null) {
try {
c.disconnect();
} catch (Exception ex) {
//disconnect error
}
}
}
return null;
}
}
提前致谢
从 Android 3 及更高版本开始,不允许在 UI 线程上进行网络操作 运行,因此您的应用程序将因 NetworkOnMainThreadException
而崩溃。
在这里您可以找到一个 Asyntask
的简单示例,您将异步处理您的代码:
我推荐阅读这篇文章url
添加异步任务;
public class TestAsyncTask extends AsyncTask<Void, Void, String> {
private Context mContext;
private String mUrl;
public TestAsyncTask(Context context, String url) {
mContext = context;
mUrl = url;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
dynamictext = (TextView) findViewById(R.id.dynamictext);
}
@Override
protected String doInBackground(Void... params) {
String resultString = null;
resultString = getJSON(mUrl);
return resultString;
}
@Override
protected void onPostExecute(String strings) {
super.onPostExecute(strings);
dynamictext.setText(strings);
}
private String getJSON(String url) { ... }
}
使用异步任务;
public class MainActivity ... {
private TextView dynamictest;
onCreate() {
...
TestAsyncTask testAsyncTask = new TestAsyncTask(MainActivity.this, "my url here");
testAsyncTask.execute();
}
}
要执行耗时的任务,您需要实施异步任务,该任务将在非 UI 线程上 运行,因为您不能在 UI 线程上执行此类操作。
并且您可以在 activity 的 onStart() 方法中执行异步任务,并覆盖异步任务的 onPostMethod() 以实现您希望对 UI 执行的任何更改一旦网络运行
检查 http://developer.android.com/reference/android/os/AsyncTask.html 以了解有关异步任务的详细信息。
private void taskPostExecute(String url)
{
myTask2=(RequestTask)new RequestTask().execute(url);
}
class RequestTask extends AsyncTask<String, String, String> {
@Override
protected String doInBackground(String... uri) {
try {
postData(uri[0]);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onCancelled() {
myTask2.cancel(true);
}
@Override
protected void onPostExecute(String url) {
LinearLayouts();
}
}
public static String postData(String url) throws UnsupportedEncodingException {
HttpClient httpclient = new DefaultHttpClient();
HttpGet httppost = new HttpGet(url);
String responseString = "";
try {
HttpResponse response = httpclient.execute(httppost);
StatusLine statusLine = response.getStatusLine();
InputStream inputStream = null;
if(statusLine.getStatusCode() == HttpStatus.SC_OK){
inputStream = response.getEntity().getContent();
if(inputStream != null)
responseString = convertInputStreamToString(inputStream);
else
responseString = "Did not work!";
JSONObject reader = null;
JSONArray sys = null;
try {
reader = new JSONObject(responseString);
String res_metar = reader.getString("TAG");
} catch (JSONException e) {
e.printStackTrace();
}
//a = responseString;
} else{
response.getEntity().getContent().close();
throw new IOException(statusLine.getReasonPhrase());
}
} catch (ClientProtocolException e) {
} catch (IOException e) {
// process execption
}
return responseString;
}
private static String convertInputStreamToString(InputStream inputStream) throws IOException{
BufferedReader bufferedReader = new BufferedReader( new InputStreamReader(inputStream));
String line = "";
String result = "";
while((line = bufferedReader.readLine()) != null)
result += line;
inputStream.close();
return result;
}
你可以试试,效果不错
我目前正在尝试访问我的 android 应用程序上的 JSON 对象。但是,我不断收到以下错误:
android.os.NetworkOnMainThreadException
通过稍微研究一下,我目前唯一的信息是我需要异步执行此操作(?)
这是我的代码:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView dynamictext;
dynamictext = (TextView) findViewById(R.id.dynamictext);
dynamictext.setText(getJSON("my url here"));
}
public String getJSON(String url) {
HttpURLConnection c = null;
try {
URL u = new URL(url);
c = (HttpURLConnection) u.openConnection();
c.connect();
int status = c.getResponseCode();
switch (status) {
case 200:
case 201:
BufferedReader br = new BufferedReader(new InputStreamReader(c.getInputStream()));
StringBuilder sb = new StringBuilder();
String line;
while ((line = br.readLine()) != null) {
sb.append(line+"\n");
}
br.close();
return sb.toString();
}
} catch (Exception ex) {
return ex.toString();
} finally {
if (c != null) {
try {
c.disconnect();
} catch (Exception ex) {
//disconnect error
}
}
}
return null;
}
}
提前致谢
从 Android 3 及更高版本开始,不允许在 UI 线程上进行网络操作 运行,因此您的应用程序将因 NetworkOnMainThreadException
而崩溃。
在这里您可以找到一个 Asyntask
的简单示例,您将异步处理您的代码:
我推荐阅读这篇文章url
添加异步任务;
public class TestAsyncTask extends AsyncTask<Void, Void, String> {
private Context mContext;
private String mUrl;
public TestAsyncTask(Context context, String url) {
mContext = context;
mUrl = url;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
dynamictext = (TextView) findViewById(R.id.dynamictext);
}
@Override
protected String doInBackground(Void... params) {
String resultString = null;
resultString = getJSON(mUrl);
return resultString;
}
@Override
protected void onPostExecute(String strings) {
super.onPostExecute(strings);
dynamictext.setText(strings);
}
private String getJSON(String url) { ... }
}
使用异步任务;
public class MainActivity ... {
private TextView dynamictest;
onCreate() {
...
TestAsyncTask testAsyncTask = new TestAsyncTask(MainActivity.this, "my url here");
testAsyncTask.execute();
}
}
要执行耗时的任务,您需要实施异步任务,该任务将在非 UI 线程上 运行,因为您不能在 UI 线程上执行此类操作。
并且您可以在 activity 的 onStart() 方法中执行异步任务,并覆盖异步任务的 onPostMethod() 以实现您希望对 UI 执行的任何更改一旦网络运行 检查 http://developer.android.com/reference/android/os/AsyncTask.html 以了解有关异步任务的详细信息。
private void taskPostExecute(String url)
{
myTask2=(RequestTask)new RequestTask().execute(url);
}
class RequestTask extends AsyncTask<String, String, String> {
@Override
protected String doInBackground(String... uri) {
try {
postData(uri[0]);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onCancelled() {
myTask2.cancel(true);
}
@Override
protected void onPostExecute(String url) {
LinearLayouts();
}
}
public static String postData(String url) throws UnsupportedEncodingException {
HttpClient httpclient = new DefaultHttpClient();
HttpGet httppost = new HttpGet(url);
String responseString = "";
try {
HttpResponse response = httpclient.execute(httppost);
StatusLine statusLine = response.getStatusLine();
InputStream inputStream = null;
if(statusLine.getStatusCode() == HttpStatus.SC_OK){
inputStream = response.getEntity().getContent();
if(inputStream != null)
responseString = convertInputStreamToString(inputStream);
else
responseString = "Did not work!";
JSONObject reader = null;
JSONArray sys = null;
try {
reader = new JSONObject(responseString);
String res_metar = reader.getString("TAG");
} catch (JSONException e) {
e.printStackTrace();
}
//a = responseString;
} else{
response.getEntity().getContent().close();
throw new IOException(statusLine.getReasonPhrase());
}
} catch (ClientProtocolException e) {
} catch (IOException e) {
// process execption
}
return responseString;
}
private static String convertInputStreamToString(InputStream inputStream) throws IOException{
BufferedReader bufferedReader = new BufferedReader( new InputStreamReader(inputStream));
String line = "";
String result = "";
while((line = bufferedReader.readLine()) != null)
result += line;
inputStream.close();
return result;
}
你可以试试,效果不错