【发布时间】:2017-09-19 20:20:38
【问题描述】:
所以我得到了这个类,它假设获取一个 jsonfile,然后将其解析为一个 jsonObject,该对象稍后将转换为我将在我的片段中处理的日历实例列表。
目前,我正在 doInBackground 函数中对 json 对象进行请求和解析,并返回一个日历实例列表。我几乎没有在 android studios 中使用线程和 AsyncTask 的经验。
但是我收到以下错误(请参阅 logcat)
09-19 20:08:46.614 13504-13504/com.abc.socke.abcE/AndroidRuntime: FATAL EXCEPTION: main
Process: com.abc.socke.abc, PID: 13504
java.lang.ClassCastException: com.abc.socke.abc.Calendar cannot be cast to java.util.List
at com.abc.socke.abc.CalendarFragment.onCreateView(CalendarFragment.java:46)
at android.support.v4.app.Fragment.performCreateView(Fragment.java:2354)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1419)
at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1740)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1809)
at android.support.v4.app.BackStackRecord.executeOps(BackStackRecord.java:799)
at android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2580)
at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2367)
at android.support.v4.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2322)
at android.support.v4.app.FragmentManagerImpl.execSingleAction(FragmentManager.java:2199)
at android.support.v4.app.BackStackRecord.commitNowAllowingStateLoss(BackStackRecord.java:651)
at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:145)
at android.support.v4.view.ViewPager.populate(ViewPager.java:1236)
at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:662)
at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:624)
at android.support.v4.view.ViewPager.setCurrentItem(ViewPager.java:605)
at android.support.design.widget.TabLayout$ViewPagerOnTabSelectedListener.onTabSelected(TabLayout.java:2170)
at android.support.design.widget.TabLayout.dispatchTabSelected(TabLayout.java:1165)
at android.support.design.widget.TabLayout.selectTab(TabLayout.java:1158)
at android.support.design.widget.TabLayout.selectTab(TabLayout.java:1128)
at android.support.design.widget.TabLayout$Tab.select(TabLayout.java:1427)
at android.support.design.widget.TabLayout$TabView.performClick(TabLayout.java:1537)
at android.view.View$PerformClick.run(View.java:24697)
at android.os.Handler.handleCallback(Handler.java:789)
at android.os.Handler.dispatchMessage(Handler.java:98)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6541)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
这将我引导到我试图拨打此电话的 Fragment 中的这一行。
calendarEvents = (List<Calendar>) new Calendar().execute("https://api.myjson.com/bins/7cp25");
问题: 我究竟做错了什么?
我是否应该将我的 http 请求解析为 JsonObject,然后在 onPostExecute 而不是 doInBackground 中创建我的日历实例?
请尝试寻求任何帮助!
package com.MyAppName.Myname.MyAppName;
import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.util.Log;
import com.facebook.GraphResponse;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.json.simple.parser.JSONParser;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.List;
public class Calendar extends AsyncTask<String, Void, List<Calendar>> {
private String SUMMARY;
private String DTSTART;
private String data;
public static final String REQUEST_METHOD = "GET";
public static final int READ_TIMEOUT = 15000;
public static final int CONNECTION_TIMEOUT = 15000;
public String getEventSummary() {
return SUMMARY;
}
public String getEventTime() {
return DTSTART;
}
public Calendar(String eventName, String etimeStamp) {
SUMMARY = eventName;
DTSTART = etimeStamp;
}
public Calendar() {
}
@Override
protected List<Calendar> doInBackground(String... params) {
String inputUrl = params[0];
Log.v("PARAMS[0] URL: ", inputUrl);
try {
URL url = new URL(inputUrl);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
//Set methods and timeouts
connection.setRequestMethod(REQUEST_METHOD);
connection.setReadTimeout(READ_TIMEOUT);
connection.setConnectTimeout(CONNECTION_TIMEOUT);
//Connect to our url
connection.connect();
InputStream inputStream = connection.getInputStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
String line = "";
while (line != null) {
line = bufferedReader.readLine();
data = data + line;
}
} catch (MalformedURLException e) {
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("FETCHCALENDAREVENT");
List<Calendar> allCalendarEvents = new ArrayList<Calendar>();
try {
JSONObject JsonData = new JSONObject(data);
JSONArray data = JsonData.getJSONArray("VEVENT");
for (int i = 0; i < data.length(); i++) {
JSONObject jsonData = data.getJSONObject(i);
String event_name = jsonData.getString("SUMMARY");
String timeStamp = jsonData.getString("DTSTART;VALUE=DATE");
Calendar calendarEvent = new Calendar(event_name, timeStamp);
allCalendarEvents.add(calendarEvent);
}
} catch (JSONException e) {
e.printStackTrace();
}
Log.v("KOM HIT", "SKODKSODSODKOS");
Log.v("all allCalendarEvents!", allCalendarEvents.get(2).getEventSummary());
return allCalendarEvents;
}
protected void onPostExecute(List<Calendar> allCalendarEvents) {
super.onPostExecute(allCalendarEvents);
}
}
更新:我尝试在 onPostExecute 中做我的事情。但是这里有什么问题?:
ArrayList<String> calendarItems = new ArrayList<String>();
CalendarFragment.listView = CalendarFragment.view.findViewById(R.id.calendar_list_view);
for(int i = 0; i < allCalendarEvents.size(); i++){
calendarItems.add(i, allCalendarEvents.get(i).getEventSummary().toString() + "\n" + allCalendarEvents.get(i).getEventTime().toString());
}
if(CalendarFragment.listView != null){
ArrayAdapter<String> listViewAdapter = new ArrayAdapter<String>(
CalendarFragment.context,
android.R.layout.simple_list_item_2,
calendarItems);
CalendarFragment.listView.setAdapter(listViewAdapter);
我用 CalendarFragment.context 替换了 getActivity() 以便它更新正确的,我还调用了 CalendarFragment.listview。我应该以其他方式来做这件事吗?
【问题讨论】:
-
calendarEvents = (List<Calendar>) new Calendar().execute使用回调将分配移动到 onPostExecute 是错误的。如果您需要帮助,只需告诉您制作一个小样本即可。
标签: java android json http android-asynctask