【问题标题】:Why I not get List<MovieModel> ArrayList data from separate AsyncTask class to Fragment Class?为什么我没有从单独的 AsyncTask 类获取 List<MovieModel> ArrayList 数据到 Fragment 类?
【发布时间】:2016-03-15 22:37:58
【问题描述】:

请在我错的地方帮助我。我对这个问题感到厌倦。 我有一个类 ForcastTask 扩展了 AsyncTask,另一个类 ForcastFragment 扩展了 Fragment 实现了 AsyncResponse 和 Main Activity 类。

我想从 AsyncTask 类中获取 onPostExcute(List data) 并使用 AsyncResponse 接口发送到 ForcastFragment 类。

但它只显示null,我在json查看器中检查了我的查询参数在线它可以工作,当我在单个类中尝试它时它可以正常工作。

public class ForecastTask extends AsyncTask<String, String, List<MovieModel>> {
    private final String LOG_TAG = ForecastTask.class.getSimpleName();    
    public AsyncResponse delegate=null;
    public List<MovieModel> movieModelList=null;
    @Override
    protected List<MovieModel> doInBackground(String... params) {
        if (params.length == 0) {
            return null;
        }

        String Popularity = "http://api.themoviedb.org/3/discover/movie?sort_by=popularity.desc&api_key=XXXXXxxxxxxxxxxxxx";

        HttpURLConnection connection = null;
        BufferedReader reader = null;

        try {
            URL url = new URL(Popularity);
            connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("GET");
            connection.connect();

            InputStream inputStream = connection.getInputStream();
            if (inputStream == null) {
                return null;
            }

            reader = new BufferedReader(new InputStreamReader(inputStream));
            StringBuffer buffer = new StringBuffer();
            String line;
            while ((line = reader.readLine()) != null) {
                buffer.append(line);
            }

            JSONObject jsonObject = new JSONObject(buffer.toString());
            JSONArray jsonArray = jsonObject.getJSONArray("results");

            //adding JSON Array data into MovieModel Class
            movieModelList = new ArrayList<>();
            for (int i = 0; i < jsonArray.length(); i++) {
                JSONObject finalObject = jsonArray.getJSONObject(i);
                MovieModel movieModel = new MovieModel();
                    movieModel.setId(finalObject.getInt("id"));
                    movieModel.setTitle(finalObject.getString("title"));
                    movieModel.setPoster_path(finalObject.getString("poster_path"));
                    movieModel.setRelease_date(finalObject.getString("release_date"));
                    movieModel.setVote_average((float) finalObject.getDouble("vote_average"));
                    movieModel.setOverview(finalObject.getString("overview"));
                movieModelList.add(movieModel);
            }

            return movieModelList;
        } catch (JSONException | IOException e) {
            e.printStackTrace();
        } finally {
            if (connection != null) {
                connection.disconnect();
            }
            try {
                if (reader != null) {
                    reader.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
         }
        return null;
    }

    @Override
    protected void onPostExecute(List<MovieModel> movieModels) {
        delegate.processFinish(movieModels);
    }
}

2- ForecastFragment 类

public class ForecastFragment extends Fragment implements AsyncResponse{
    private List<MovieModel> movieModelList=null;
    private static final String STATE_MOVIES ="state_movies";
    private CustomAdapter customAdapter =null;
    private GridView gridView=null;
    private View rootView=null;

    ForecastTask forecastTask=new ForecastTask();

    //Constructor
    public ForecastFragment() {
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setHasOptionsMenu(true);

        forecastTask.delegate=this;
        forecastTask.execute("Popular");
    }
    @Override
    public void processFinish(List<MovieModel> movieModels) {
        movieModelList=movieModels;
    }
    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putParcelableArrayList(STATE_MOVIES, (ArrayList<? extends Parcelable>) movieModelList);
    }

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        super.onCreateOptionsMenu(menu, inflater);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()){
            case R.id.most_Popular:
                if(item.isChecked()){
                    item.setChecked(false);
                }else{
                    item.setChecked(true);
                    new ForecastTask().execute("Popular");
                    return true;
                }
            case R.id.High_rated:
                if(item.isChecked()){
                    item.setChecked(false);
                }else{
                    item.setChecked(true);
                    new ForecastTask().execute("TOP_RATED");
                    return true;
                }
        }
        return super.onOptionsItemSelected(item);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        rootView = inflater.inflate(R.layout.activity_main, container, false);

        customAdapter= new CustomAdapter(
                getActivity(),
                R.layout.list_image_forecast,
                movieModelList);
        gridView=(GridView)rootView.findViewById(R.id.gridView);

        if (movieModelList==null){
            Toast.makeText(getActivity(),"Null",Toast.LENGTH_SHORT).show();
        }else {
            Toast.makeText(getActivity(), "Data", Toast.LENGTH_SHORT).show();

            gridView.setAdapter(customAdapter);
            gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                    String movie_name = movieModelList.get(position).getTitle();
                    String poster_path = movieModelList.get(position).getPoster_path();
                    String release_date = movieModelList.get(position).getRelease_date();
                    Float users_rating = movieModelList.get(position).getVote_average();
                    String overview = movieModelList.get(position).getOverview();

                    Intent intent = new Intent(getActivity(), DetailActivity.class)
                            .putExtra("movie_Name", movie_name)
                            .putExtra("poster_Path", poster_path)
                            .putExtra("release_Date", release_date)
                            .putExtra("users_Rating", users_rating)
                            .putExtra("overview", overview);
                    startActivity(intent);
                }
            });
        }
        return rootView;
    }
}

3- 异步接口

public interface AsyncResponse {
    void processFinish(List<MovieModel> movieModels);
}

4-电影数据库

public class MovieModel implements Parcelable {
    private int id;
    private String title;
    private String poster_path;
    private String release_date;
    private float vote_average;
    private String overview;

    private List<MovieModel> models;
    public MovieModel(){

    }

    public List<MovieModel> getModels() {
        return models;
    }

    public void setModels(List<MovieModel> models) {
        this.models = models;
    }

    public MovieModel(int id, String title, String poster_path, String release_date, float vote_average, String overview) {
        this.id = id;
        this.title = title;
        this.poster_path = poster_path;
        this.release_date = release_date;
        this.vote_average = vote_average;
        this.overview = overview;
    }

    protected MovieModel(Parcel in) {
        id = in.readInt();
        title = in.readString();
        poster_path = in.readString();
        release_date = in.readString();
        vote_average = in.readFloat();
        overview = in.readString();
    }

    public static final Creator<MovieModel> CREATOR = new Creator<MovieModel>() {
        @Override
        public MovieModel createFromParcel(Parcel in) {
            return new MovieModel(in);
        }

        @Override
        public MovieModel[] newArray(int size) {
            return new MovieModel[size];
        }
    };

    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }

    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }

    public String getPoster_path() {
        return poster_path;
    }
    public void setPoster_path(String poster_path) {
        this.poster_path = poster_path;
    }

    public String getRelease_date() {
        return release_date;
    }
    public void setRelease_date(String release_date) {
        this.release_date = release_date;
    }

    public float getVote_average() {
        return vote_average;
    }
    public void setVote_average(float vote_average) {
        this.vote_average = vote_average;
    }

    public String getOverview() {
        return overview;
    }
    public void setOverview(String overview) {
        this.overview = overview;
    }


    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel out, int flags) {
        out.writeInt(id);
        out.writeString(title);
        out.writeString(poster_path);
        out.writeString(release_date);
        out.writeFloat(vote_average);
        out.writeString(overview);
    }

}

5- 主要活动

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        // Call the ForecastFragment Class by getFragmentManager
        getFragmentManager()
                .beginTransaction()
                .add(R.id.Fragment_Container, new ForecastFragment(),
                        ForecastTask.class.getSimpleName())
                .commit();
    }

【问题讨论】:

    标签: android android-asynctask android-arrayadapter parcelable parcel


    【解决方案1】:

    您只在定义为片段成员的forecastTask 中分配delegate 一次。但是您在其他地方创建了多个任务而没有分配他们的代表。您可能需要为每个任务分别分配委托,以便在 onPostExecute 中进行更改,否则它将因 NullPointerException 而崩溃。

    【讨论】:

    【解决方案2】:

    我建议您将 AsyncResponse 的对象传递给 ForecastTask 构造函数。

    public ForecastTask(AsyncResponse listener){
        delegate = listener;
    }
    

    在你的片段中你可以做到这一点。

    ForecastTask forecastTask = new ForecastTask(this);
    forecastTask.execute("Popular");
    

    【讨论】:

    • 我尝试了,但它不起作用。请查看我的 github 帐户,链接错误:github.com/superssingh/MyMovieApp_Testing.git
    猜你喜欢
    • 2011-11-08
    • 1970-01-01
    • 1970-01-01
    • 2016-02-20
    • 2022-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多