我无法从 AsyncTask 子类中的 doInBackground 方法获取数据



我正试图在应用程序中获取地震数据,但我的应用程序已停止工作。我的代码中没有错误。甚至我还添加了互联网权限。但在获取数据时,我认为会出现此错误。我已经调试过了,但找不到问题。

Logcat:

2021-03-27 15:23:32.118 9533-9560/com.example.quakerreportappE/eglCodecCommon:glUtilsParamSize:unknow param 0x000082da 2021-03-2715:23:32.118 9533-9560/com.example.quakerreportapp E/eglCodec命令:glUtilsParamSize:未知参数0x000082da设备类型=5,ret=-1 2021-03-27 15:23:37.091的ioctl_ping失败9533-9533/com.example.quakereportapp E/AndroidRuntime:FATAL例外:main流程:com.example.quakereportapp,PID:9533android.os.NetworkOnMainThreadException在android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1513(网址:com.android.org/conscrypt.Platform.blockGuardOnNetwork(Platform.java:415(网址:com.android.org/conscrypt.ConscryptFileDescriptorSocket.shutdownAndFreeSslNative(ConscryptFileDescriptorSocket.java:1005(网址:com.android.org/conscrypt.ConscryptFileDescriptorSocket.close(ConscryptFileDescriptorSocket.java:1000(网址:com.android.okhttp://internal.Util.closeQuietly(Util.java:86(网址:com.android.okhttp://internal.http.StreamAllocation.deallocate(StreamAllocation.java:256(在com.android.okhttp://internal.http.StreamAllocation.connectionFailed(StreamAllocation.java:293(网址:com.android.okhttp.internal.HttpEngine.close(HttpEngine.java:445(网址:com.android.okhttp://internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:509(网址:com.android.okhttp://internal.huc.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:407(网址:com.android.okhttp://internal.huc.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:538(网址:com.android.okhttp.internal.huc.DelegatingHttpsURLConnection.getResponseCode(DelegatingHttpsURLConnection.java:105(网址:com.android.okhttp://internal.huc.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnection Impl.java:26(在com.example.quakereportapp.QueryUtils.makeHttpRequest(QueryUtils.java:82(网址:com.example.quakereportapp.QueryUtils.fetchEarthquakeData(QueryUtils.java:35(网址:com.example.quakereportapp.MainActivity.updateUi(MainActivity.java:27(网址:com.example.quakereportapp.MainActivity.access$100(MainActivity.java:14(在com.example.quakereportapp.MainActivity$EarthQuakeAsyncTask.onPostExecute(MainActivity.java:58(在com.example.quakereportapp.MainActivity$EarthQuakeAsyncTask.onPostExecute(MainActivity.java:33(在android.os.AsyncTask.fining上(AsyncTask.java:695(在android.os.AsyncTask.access上$600(AsyncTask.java:180(在android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:712(在android.os.Handler.dispatchMessage(Handler.java:106(在android.os.Looper.loop(Looper.java:193(在android.app.ActivityThread.main(ActivityThreads.java:6669(位于java.lang.reflect.Method.ioke(本机方法(网址:com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493(网址:com.android.internal.os.ZygoteInit.main(ZygoteNit.java:858(

我的异步任务子类

private void updateUi(List<Earthquake> earthquakes) {
listView = findViewById(R.id.list_view);
ArrayList<Earthquake> earthquake = QueryUtils.fetchEarthquakeData(url);
EarthquakeAdapter earthquakeAdapterArrayAdapter = new EarthquakeAdapter(this, earthquake);
listView.setAdapter(earthquakeAdapterArrayAdapter);
}
private class EarthQuakeAsyncTask extends AsyncTask<String, Void, List<Earthquake>> {

@Override
protected  ArrayList<Earthquake> doInBackground(String... urls) {
ArrayList<Earthquake> result = QueryUtils.fetchEarthquakeData(urls[0]);
return result;
}

@Override
protected void onPostExecute(List<Earthquake> result) {
updateUi(result);
}

QueryUtils类中的JSON提取器方法

private static ArrayList<Earthquake> extractFeatureFromJson(String earthquakeJSON) {
// If the JSON string is empty or null, then return early.
if (TextUtils.isEmpty(earthquakeJSON)) {
return null;
}
ArrayList<Earthquake> earthquakes = new ArrayList<>();

try {
JSONObject baseJsonResponse = new JSONObject(earthquakeJSON);
JSONArray earthquakeArray = baseJsonResponse.getJSONArray("features");
for (int i = 0; i < earthquakeArray.length(); i++) {
//creates object from the given array
JSONObject currentEarthquake = earthquakeArray.getJSONObject(i);
//stores all the data from properties to properties object
JSONObject properties = currentEarthquake.getJSONObject("properties");
//here we assign the value of the specified keys from the properties
String magnitude = properties.getString("mag");
String location = properties.getString("place");
long time = properties.getLong("time");
//and now we create a new earthquake in every loop
Earthquake earthquake = new Earthquake(magnitude, location, time);
//finally we add it to the earthquakes list
earthquakes.add(earthquake);
}
} catch (JSONException e) {
Log.e(LOG_TAG, "Problem parsing the earthquake JSON results", e);
}
return earthquakes;
}

抛出异常是因为您正在从主线程调用API。代码中的问题是您正在调用API两次。在doInBackground中一次,然后在updateUi中再次。从updateUi中删除对QueryUtils.fetchEarthquakeData(url)的调用,它应该是这样的。

private void updateUi(List<Earthquake> earthquakes) {
listView = findViewById(R.id.list_view);
EarthquakeAdapter earthquakeAdapterArrayAdapter = new EarthquakeAdapter(this, earthquakes);
listView.setAdapter(earthquakeAdapterArrayAdapter);
}

最新更新