我正在寻找一种方法来从 URL 解析 JSON 字符串,然后将其传递给 GSON 以对其进行反序列化。我的目标是将转换后的文本放入 RecyclerViewAdapter。
我已经尝试执行建议和建议 Parsing JSON from URL但 这种方法对我不起作用。
首先,我创建了一个具有 4 个属性的 JavaObject 类(称为数据)。这些属性与我的 URL 中的字段相同:
public class Data {
private String title;
private String version;
private String kind;
private String etag;
public String getTitle() {
return title;
}
public String getVersion() {
return version;
}
public String getKind() {
return kind;
}
public String getEtag() {
return etag;
}
public void setTitle(String title) {
this.title = title;
}
public void setVersion(String version) {
this.version = version;
}
public void setKind(String kind) {
this.kind = kind;
}
public void setEtag(String etag) {
this.etag = etag;
}
public String toString() {
return String.format("title: %s, "
+ "version: %s, "
+ "kind: %s, "
+ "etag: %s",
title, version, kind, etag);
}
}
从我的 URL 获取数据并通过 GSON 进行转换的过程应该发生在我的 fragment 的以下 onCreateView 方法中:
public class Fragment extends android.support.v4.app.Fragment {
public static final String FRAGMENT_TAG = "Fragment";
private OnListFragmentInteractionListener mListener;
public Fragment() {
}
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
Log.i(FRAGMENT_TAG, "onCreate()");
setHasOptionsMenu(true);
}
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
Log.i(JSONS_FRAGMENT_TAG, "onCreateView()");
View view = inflater.inflate(R.layout.fragment_jsons_list, container,
false);
if (view instanceof RecyclerView) {
Context context = view.getContext();
RecyclerView recyclerView = (RecyclerView) view;
URL url = null;
try {
// Definition of the URL with the JSON-Strings
url = new URL("http://www.jsoneditoronline.org
/?id=b1b4f5e2526ab04b562723bccae30a40");
} catch (MalformedURLException e) {
e.printStackTrace();
}
InputStreamReader reader = null;
try {
// InputStreamReader is responsible to open and consume the
// URL
reader = new InputStreamReader(url.openStream());
} catch (IOException e) {
e.printStackTrace();
}
// Conversion via GSON
Data data = new Gson().fromJson(reader, Data.class);
List<Data> listdata = new ArrayList<Data>();
listdata.add(data);
recyclerView.setAdapter(new
JSONSRecyclerViewAdapter(listdata,mListener));
}
return view;
}
每次我尝试运行该应用程序时,它都会立即停止,并且 logcat 输出表明我的 onCreateView 方法存在问题。 logcat 输出如下:
05-08 09:21:47.179 recandroidapp E/UncaughtException:
android.os.NetworkOnMainThreadException
at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1303)
at java.net.Inet6AddressImpl.lookupHostByName(Inet6AddressImpl.java:86)
at java.net.Inet6AddressImpl.lookupAllHostAddr(Inet6AddressImpl.java:74)
at java.net.InetAddress.getAllByName(InetAddress.java:752)
at com.android.okhttp.internal.Network$1.resolveInetAddresses(Network.java:29)
at com.android.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:187)
at com.android.okhttp.internal.http.RouteSelector.nextProxy(RouteSelector.java:156)
at com.android.okhttp.internal.http.RouteSelector.next(RouteSelector.java:98)
at com.android.okhttp.internal.http.HttpEngine.createNextConnection(HttpEngine.java:345)
at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:328)
at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:246)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:457)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:405)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:243)
at java.net.URL.openStream(URL.java:1057)
at recandroidapp.fragments.JSONSFragment.onCreateView(JSONSFragment.java:68)
at android.support.v4.app.Fragment.performCreateView(Fragment.java:2080)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1108)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1290)
at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:801)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1677)
at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:536)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6077)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)
为了避免 NetworkOnMainThreadException,我尝试调用 AsyncTask(正如用户 play_err_、user12345 和 Aashish Aadarsh 在我最初发帖后所建议的——感谢您的帮助!)。 不幸的是,这会触发另一个关于 doInBackground() 方法的错误。 这是我在实现 AsyncTask 后收到的新 logcat 输出:
您有什么想法/建议吗? 谢谢!
最佳答案
从您的代码看来,您正在主线程上执行 NW 调用,这将导致 NetworkOnMainThreadException。
尝试在 AsyncTask 上进行 NW 调用,并在 postExceuteMethod 中处理数据(将数据发送到适配器)。
关于android - 使用 GSON 从 URL 解析 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43844145/