Java 任务问题,我做错了吗?

Java 任务问题,我做错了吗?,java,android,json,http,android-asynctask,Java,Android,Json,Http,Android Asynctask,因此,我得到了这个类,该类假定获取一个jsonfile,然后将其解析为一个jsonObject,该jsonObject稍后将转换为我将在片段中处理的日历实例列表 目前,我正在doInBackground函数中请求和解析json对象,并返回日历实例列表。我几乎没有在android Studio中使用线程或异步任务的经验 但是,我得到以下错误(请参阅logcat) 这就把我引向了片段中的这一行,我正试图打这个电话 calendarEvents = (List<Calendar>) new

因此,我得到了这个类,该类假定获取一个jsonfile,然后将其解析为一个jsonObject,该jsonObject稍后将转换为我将在片段中处理的日历实例列表

目前,我正在doInBackground函数中请求和解析json对象,并返回日历实例列表。我几乎没有在android Studio中使用线程或异步任务的经验

但是,我得到以下错误(请参阅logcat)

这就把我引向了片段中的这一行,我正试图打这个电话

calendarEvents = (List<Calendar>) new Calendar().execute("https://api.myjson.com/bins/7cp25");
calendarEvents=(列表)新建日历()。执行(“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);
    }

}
package com.MyAppName.Myname.MyAppName;
导入android.app.ProgressDialog;
导入android.os.AsyncTask;
导入android.util.Log;
导入com.facebook.GraphResponse;
导入org.json.JSONArray;
导入org.json.JSONException;
导入org.json.JSONObject;
导入org.json.simple.parser.JSONParser;
导入java.io.BufferedReader;
导入java.io.FileReader;
导入java.io.IOException;
导入java.io.InputStream;
导入java.io.InputStreamReader;
导入java.net.HttpURLConnection;
导入java.net.MalformedURLException;
导入java.net.URL;
导入java.text.ParseException;
导入java.util.ArrayList;
导入java.util.List;
公共类日历任务{
私有字符串摘要;
私有字符串DTSTART;
私有字符串数据;
公共静态最终字符串请求\u METHOD=“GET”;
公共静态最终整型读取超时=15000;
公共静态最终int连接\u超时=15000;
公共字符串getEventSummary(){
返回摘要;
}
公共字符串getEventTime(){
返回DTSTART;
}
公共日历(字符串eventName、字符串etimeStamp){
SUMMARY=eventName;
DTSTART=etimeStamp;
}
公历(){
}
@凌驾
受保护列表doInBackground(字符串…参数){
字符串inputUrl=params[0];
Log.v(“参数[0]URL:”,inputUrl);
试一试{
URL URL=新URL(输入URL);
HttpURLConnection connection=(HttpURLConnection)url.openConnection();
//设置方法和超时
connection.setRequestMethod(请求方法);
setReadTimeout(读取超时);
connection.setConnectTimeout(连接超时);
//连接到我们的url
connection.connect();
InputStream InputStream=connection.getInputStream();
BufferedReader BufferedReader=新的BufferedReader(新的InputStreamReader(inputStream));
字符串行=”;
while(行!=null){
line=bufferedReader.readLine();
数据=数据+行;
}
}捕获(格式错误){
}捕获(IOE异常){
e、 printStackTrace();
}
System.out.println(“FETCHCALENDAREVENT”);
List allCalendarEvents=new ArrayList();
试一试{
JSONObject JsonData=新的JSONObject(数据);
JSONArray data=JsonData.getJSONArray(“VEVENT”);
对于(int i=0;i
更新:我尝试在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);
ArrayList calendarItems=new ArrayList();
CalendarFragment.listView=CalendarFragment.view.findViewById(R.id.calendar\u列表\u视图);
对于(int i=0;i
我用CalendarFragment.context替换了getActivity(),以便它更新正确的版本,我还调用了CalendarFragment.listview。我应该用另一种方式来完成吗?

在这一行中

calendarEvents = (List<Calendar>) new Calendar().execute("https://api.myjson.com/bins/7cp25");
calendarEvents=(列表)新建日历()。执行(“https://api.myjson.com/bins/7cp25");
您正试图将
日历
instace(它是execute()方法返回的
异步任务
实例)强制转换为
列表
。它的类型完全不同-这就是为什么您会得到
ClassCastException


更重要的是,您在代码中做了一件非常奇怪的事情:您使用一个相同的异步任务列表作为结果类型来参数化您的
AsyncTask
任务。我非常怀疑这是您的意图。

我想您对AsyncTask有一点误解

问题是您正在创建AsyncTask对象并试图将其分配给List类型的对象。因此,引发异常

在AsyncTask
doInBackground
中,您执行您的工作。当工作完成时,将触发return语句:

return allCalendarEvents;
该对象,在本例中为日历对象列表,
return allCalendarEvents;
public interface IfaceCalendar {
    void onCalendaruResult(List<Calendar> list);
}

public IfaceCalendar listener;

public void SetListener(IfaceCalendar listener) {
    this.listener = listener;
}
@Override
public void onPostExecute(List<Calendar> list)
{
    if (listener != null) {
        listener.onCalendarResult(list);
    }
}
Calendar c = new Calendar();
c.SetListener(this);
c.execute("https://api.myjson.com/bins/7cp25");
@Override
public void onCalendarResult(List<Calendar> list) {
    // You have your list here. Do what you want with it
}