我想使用 http 从服务器获取 JSONObject
i want to get JSONObject from server using http
我对一些已弃用的方法有疑问。(httpDefault)
我想要的很简单:我有 url (json 数据) -> 发送请求 -> 接收 jsonObject.
我不知道。我已经尝试了一些教程,但它对我不起作用。
( 1. http://techlovejump.com/android-json-parser-from-url/
2. https://www.youtube.com/watch?v=Fmo3gDMtp8s&list=PLsoBxH455yoZZeeza9TiG8I9dGP0zz5o9&index=4)
这是我的示例代码。只处理字符串数据。 (不是来自服务器数据。)
import org.json.JSONException;
import org.json.JSONObject;
import android.app.Activity;
import android.os.Bundle;
import android.widget.Toast;
public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/* // url : http://www.jsoneditoronline.org/?id=a31f7f816285e14991e175fccd09a561
* {
* "id":123,
* "name":abc,
* "status":"ok"
* }
*/
final String customJSON = "{\"id\":123,\"name\":abc,\"status\":\"ok\"}";
try {
JSONObject jsonObject = new JSONObject(customJSON);
int id = jsonObject.getInt("id");
String name = jsonObject.getString("name");
String status = jsonObject.getString("status");
Toast.makeText(MainActivity.this, "id #"+id+", name #"+name+", status #"+status, Toast.LENGTH_SHORT).show();
} catch (JSONException e) { e.printStackTrace(); }
}
}
请给我你的提示。
我如何获得 JSONObject(我只有 url)。
url : http://www.jsoneditoronline.org/?id=a31f7f816285e14991e175fccd09a561
执行此操作的正确方法是将请求包装在 worker thread
中。其中一种方法是使用 AsyncTask
。请参阅 http://developer.android.com/reference/android/os/AsyncTask.html 以了解 android 记录的用法,但它基本上归结为以下实现:
扩展 AsyncTask 的私有子类,它实现了以下方法:
onPreExecute
– 在任务执行之前在 UI 线程上调用,用于设置内容(例如显示进度条)
doInBackground
– 您要执行的实际操作,在 onPreExecute
之后立即触发
onPostExecute
– 在 doInBackground 完成后在 UI 线程上调用。这将 doInBackground 的结果作为参数,然后可以在 UI 线程上使用。
AsyncTask 用于 UI 线程不允许的操作,例如:
- 打开套接字连接
- HTTP 请求(例如 HTTPClient 和 HTTPURLConnection)
- 正在尝试连接到远程 MySQL 数据库
- 正在下载文件\你的JSON
您当前的代码位于将在 UI 线程上创建的方法中(这将抛出 NetworkOnMainThreadException
,因此您需要将代码移至 UI 线程=61=] 在主线程上,例如 AsyncTask、Handler 或类似的东西。我在 AndroidHive 上发现 JSON Parsing 教程对学习很有帮助,并参考 Android文档。
正如 smittey 所提到的,您需要使用后台线程或使用 AsyncTask
来执行该请求。要执行 http 请求,您可以使用库 OkHttp and here is an exampele。请记住在您的清单中使用 <uses-permission android:name="android.permission.INTERNET" />
来访问互联网。
import org.json.JSONException;
import org.json.JSONObject;
import android.app.Activity;
import android.os.Bundle;
import android.widget.Toast;
public class MainActivity extends Activity {
Context context;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
context = this;
new AsyncTask<String, Integer, String>() {
@Override
protected String doInBackground(String... params) {
StringBuilder responseString = new StringBuilder();
try {
HttpURLConnection urlConnection = (HttpURLConnection) new URL("http://you_url_here").openConnection();
urlConnection.setRequestMethod("GET");
int responseCode = urlConnection.getResponseCode();
if (responseCode == 200){
BufferedReader reader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
String line;
while ((line = reader.readLine()) != null) {
responseString.append(line);
}
}
urlConnection.disconnect();
} catch (IOException e) {
e.printStackTrace();
}
return responseString.toString();
}
@Override
protected void onPostExecute(String o) {
Toast toast = Toast.makeText(context, (CharSequence) o, Toast.LENGTH_SHORT);
toast.show();
/* if your json structure this type then it will work now
* {
* "id":123,
* "name":abc,
* "status":"ok"
* }
*/
try {
JSONObject jsonObject = new JSONObject(o);
int id = jsonObject.getInt("id");
String name = jsonObject.getString("name");
String status = jsonObject.getString("status");
Toast.makeText(MainActivity.this, "id #"+id+", name #"+name+", status #"+status, Toast.LENGTH_SHORT).show();
} catch (JSONException e) { e.printStackTrace(); }
}
}.execute("");
}
}
你可以试试这个。它对我有用,我希望它也对你有用。
我对一些已弃用的方法有疑问。(httpDefault)
我想要的很简单:我有 url (json 数据) -> 发送请求 -> 接收 jsonObject.
我不知道。我已经尝试了一些教程,但它对我不起作用。 ( 1. http://techlovejump.com/android-json-parser-from-url/ 2. https://www.youtube.com/watch?v=Fmo3gDMtp8s&list=PLsoBxH455yoZZeeza9TiG8I9dGP0zz5o9&index=4)
这是我的示例代码。只处理字符串数据。 (不是来自服务器数据。)
import org.json.JSONException;
import org.json.JSONObject;
import android.app.Activity;
import android.os.Bundle;
import android.widget.Toast;
public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/* // url : http://www.jsoneditoronline.org/?id=a31f7f816285e14991e175fccd09a561
* {
* "id":123,
* "name":abc,
* "status":"ok"
* }
*/
final String customJSON = "{\"id\":123,\"name\":abc,\"status\":\"ok\"}";
try {
JSONObject jsonObject = new JSONObject(customJSON);
int id = jsonObject.getInt("id");
String name = jsonObject.getString("name");
String status = jsonObject.getString("status");
Toast.makeText(MainActivity.this, "id #"+id+", name #"+name+", status #"+status, Toast.LENGTH_SHORT).show();
} catch (JSONException e) { e.printStackTrace(); }
}
}
请给我你的提示。
我如何获得 JSONObject(我只有 url)。 url : http://www.jsoneditoronline.org/?id=a31f7f816285e14991e175fccd09a561
执行此操作的正确方法是将请求包装在 worker thread
中。其中一种方法是使用 AsyncTask
。请参阅 http://developer.android.com/reference/android/os/AsyncTask.html 以了解 android 记录的用法,但它基本上归结为以下实现:
扩展 AsyncTask 的私有子类,它实现了以下方法:
onPreExecute
– 在任务执行之前在 UI 线程上调用,用于设置内容(例如显示进度条)doInBackground
– 您要执行的实际操作,在 onPreExecute 之后立即触发
onPostExecute
– 在 doInBackground 完成后在 UI 线程上调用。这将 doInBackground 的结果作为参数,然后可以在 UI 线程上使用。
AsyncTask 用于 UI 线程不允许的操作,例如:
- 打开套接字连接
- HTTP 请求(例如 HTTPClient 和 HTTPURLConnection)
- 正在尝试连接到远程 MySQL 数据库
- 正在下载文件\你的JSON
您当前的代码位于将在 UI 线程上创建的方法中(这将抛出 NetworkOnMainThreadException
,因此您需要将代码移至 UI 线程=61=] 在主线程上,例如 AsyncTask、Handler 或类似的东西。我在 AndroidHive 上发现 JSON Parsing 教程对学习很有帮助,并参考 Android文档。
正如 smittey 所提到的,您需要使用后台线程或使用 AsyncTask
来执行该请求。要执行 http 请求,您可以使用库 OkHttp and here is an exampele。请记住在您的清单中使用 <uses-permission android:name="android.permission.INTERNET" />
来访问互联网。
import org.json.JSONException;
import org.json.JSONObject;
import android.app.Activity;
import android.os.Bundle;
import android.widget.Toast;
public class MainActivity extends Activity {
Context context;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
context = this;
new AsyncTask<String, Integer, String>() {
@Override
protected String doInBackground(String... params) {
StringBuilder responseString = new StringBuilder();
try {
HttpURLConnection urlConnection = (HttpURLConnection) new URL("http://you_url_here").openConnection();
urlConnection.setRequestMethod("GET");
int responseCode = urlConnection.getResponseCode();
if (responseCode == 200){
BufferedReader reader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
String line;
while ((line = reader.readLine()) != null) {
responseString.append(line);
}
}
urlConnection.disconnect();
} catch (IOException e) {
e.printStackTrace();
}
return responseString.toString();
}
@Override
protected void onPostExecute(String o) {
Toast toast = Toast.makeText(context, (CharSequence) o, Toast.LENGTH_SHORT);
toast.show();
/* if your json structure this type then it will work now
* {
* "id":123,
* "name":abc,
* "status":"ok"
* }
*/
try {
JSONObject jsonObject = new JSONObject(o);
int id = jsonObject.getInt("id");
String name = jsonObject.getString("name");
String status = jsonObject.getString("status");
Toast.makeText(MainActivity.this, "id #"+id+", name #"+name+", status #"+status, Toast.LENGTH_SHORT).show();
} catch (JSONException e) { e.printStackTrace(); }
}
}.execute("");
}
}
你可以试试这个。它对我有用,我希望它也对你有用。