Java 异步任务-缺少某些内容

Java 异步任务-缺少某些内容,java,android,android-recyclerview,android-asynctask,Java,Android,Android Recyclerview,Android Asynctask,我在做一个项目,我被卡住了。。。我做错了什么,可能是AsyncTask,我不知道该修复什么以及如何修复。。。。我现在有代码 ReviewData.class public class ReviewData implements Parcelable { private String mAuthor, mContent; public ReviewData(String author, String content) { this.mAuthor = author; this.

我在做一个项目,我被卡住了。。。我做错了什么,可能是AsyncTask,我不知道该修复什么以及如何修复。。。。我现在有代码

ReviewData.class

public class ReviewData implements Parcelable {

private String mAuthor, mContent;

public ReviewData(String author, String content) {
    this.mAuthor = author;
    this.mContent = content;
}

private ReviewData(Parcel in) {
    mAuthor = in.readString();
    mContent = in.readString();
}

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

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

//Getter method for review author
public String getAuthor() {
    return mAuthor;
}

//Setter method for review author
public void setAuthor(String author) {
    this.mAuthor = author;
}

//Getter method for review content
public String getContent() {
    return mContent;
}

//Setter method for review content
public void setContent(String content) {
    this.mContent = content;
}

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

@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeString(mAuthor);
    dest.writeString(mContent);
}
杰森达。类(也仅用于评论,用于其他作品…)

//JSON供查看
公共静态ArrayList getReviewFromJson(字符串json)抛出JSONException{
ArrayList listOfReviews=新建ArrayList();
试一试{
JSONObject reviews=新的JSONObject(json);
JSONArray reviewsArray=reviews.getJSONArray(查询结果);
对于(int i=0;i
ReviewAsyncTask.class

public class ReviewAsyncTask extends AsyncTask<String, Void, ArrayList<ReviewData>> {

private ReviewData mReviewData;

public interface ReviewResponse {
    void finished(ArrayList<ReviewData> output);
}

private ReviewResponse reviewResponse = null;

public ReviewAsyncTask(ReviewResponse reviewResponse) {
    this.reviewResponse = reviewResponse;
}

@Override
protected ArrayList<ReviewData> doInBackground(String... strings) {
    String rawData = "";
    ArrayList<ReviewData> reviewList = new ArrayList<>();
    try {
        rawData = NetworkUtils.getResponseFromHttpRequest(NetworkUtils
                .buildReviewUrl(String.valueOf(mReviewData)));
        reviewList = JsonData.getReviewFromJson(rawData);
    } catch (IOException e) {
        e.printStackTrace();
        Log.e("ReviewAsyncTask", "Error in ReviewAsyncTask");
    } catch (JSONException e) {
        e.printStackTrace();
        Log.e("JSONAsync", "JSON problem");
    }

    return reviewList;
}

@Override
protected void onPostExecute(ArrayList<ReviewData> reviewData) {
    reviewResponse.finished(reviewData);

}
公共类ReviewAsyncTask扩展了AsyncTask{
私人审查数据mReviewData;
公共接口审核响应{
作废完成(ArrayList输出);
}
private ReviewResponse ReviewResponse=null;
公共审阅同步任务(审阅响应审阅响应){
this.reviewResponse=reviewResponse;
}
@凌驾
受保护的ArrayList doInBackground(字符串…字符串){
字符串rawData=“”;
ArrayList reviewList=新建ArrayList();
试一试{
rawData=NetworkUtils.getResponseFromHttpRequest(NetworkUtils
.buildReviewUrl(String.valueOf(mReviewData));
reviewList=JsonData.getReviewFromJson(rawData);
}捕获(IOE异常){
e、 printStackTrace();
Log.e(“ReviewAsyncTask”,“ReviewAsyncTask中的错误”);
}捕获(JSONException e){
e、 printStackTrace();
Log.e(“JSONAsync”,“JSON问题”);
}
返回评论列表;
}
@凌驾
PostExecute上受保护的void(ArrayList reviewData){
reviewResponse.finished(reviewData);
}
}

和MovieDetails活动(除了从评论回收评论到下一篇评论,一切正常)

public class MovieDetails extends AppCompatActivity implements ReviewAsyncTask.ReviewResponse {

private final static String BASE_URL = "http://image.tmdb.org/t/p/";
private final static String SIZE = "w185/";

private ArrayList<ReviewData> mReviewList;

private ReviewAdapter mReviewAdapter;

@BindView(R.id.poster_detail)
ImageView mMoviePoster;
@BindView(R.id.title_detail)
TextView mMovieTitle;
@BindView(R.id.release_date)
TextView mReleaseDate;
@BindView(R.id.average_vote)
TextView mAverageVote;
@BindView(R.id.synopsis)
TextView mSynopsis;

@BindView(R.id.review_recycler)
RecyclerView mReviewRecycle;

Context mContext;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_movie_details);
    ButterKnife.bind(this);

    displayMovieDetail();

    //Review RecycleView
    mReviewList = new ArrayList<>();
    mReviewAdapter = new ReviewAdapter(this, mReviewList);

    RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this);
    mReviewRecycle.setLayoutManager(layoutManager);
    mReviewRecycle.setHasFixedSize(true);
    mReviewRecycle.setAdapter(mReviewAdapter);
}

@Override
public void finished(ArrayList<ReviewData> output) {
    ReviewAsyncTask reviewAsyncTask = new ReviewAsyncTask(this);
    reviewAsyncTask.execute();
}

/* Method for displaying the info about movies in activity details
 * @param mMoviePoster sets the movie poster
 * @param mMovieTitle sets original title of the movie
 * @param mReleaseDate sets release date of the movie
 * @param mAverageVote sets average rating grade of the movie
 * @param mSynopsis sets plot of the movie */
private void displayMovieDetail() {
    int idMovie = (Integer) getIntent().getExtras().get(getString(R.string.movie_id));

    List<MovieData> movieList;
    movieList = getIntent().getParcelableArrayListExtra(getString(R.string.movie_lsit));

    MovieData movieData = movieList.get(idMovie);

    Picasso.with(mContext).load(BASE_URL + SIZE +
            movieData.getPoster()).into(mMoviePoster);
    mMovieTitle.setText(movieData.getTitle());
    mReleaseDate.setText(movieData.getReleaseDate());
    mAverageVote.setText(Double.toString(movieData.getRating()));
    mSynopsis.setText(movieData.getSynopsis());
}
公共类MovieDetails扩展AppCompatActivity实现ReviewAsyncTask.ReviewResponse{
私有最终静态字符串BASE_URL=”http://image.tmdb.org/t/p/";
私有最终静态字符串大小=“w185/”;
私有ArrayList mReviewList;
私人审阅适配器mReviewAdapter;
@BindView(R.id.poster_详图)
ImageView海报;
@BindView(R.id.title\u详图)
文本视图标题;
@BindView(R.id.发布日期)
text查看mReleaseDate;
@BindView(R.id.平均投票)
TextView mAverageVote;
@BindView(R.id.概要)
TextView mSynopsis;
@BindView(R.id.review\U回收商)
循环查看mReviewRecycle;
语境;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u movie\u details);
把(这个)绑起来;
displayMovieDetail();
//复习复习
mReviewList=新的ArrayList();
mReviewAdapter=新的ReviewAdapter(此,mReviewList);
RecyclerView.LayoutManager LayoutManager=新的LinearLayoutManager(此);
mReviewRecycle.setLayoutManager(layoutManager);
mReviewRecycle.setHasFixedSize(true);
mReviewRecycle.setAdapter(mReviewAdapter);
}
@凌驾
已完成公共作废(ArrayList输出){
ReviewAsyncTask ReviewAsyncTask=新的ReviewAsyncTask(此);
reviewAsyncTask.execute();
}
/*用于在“活动详细信息”中显示有关电影的信息的方法
*@param mMoviePoster设置电影海报
*@param mMovieTitle设置电影的原始标题
*@param mReleaseDate设置电影的发行日期
*@param mAverageVote设置电影的平均评级等级
*@param mSynopsis设置电影情节*/
私有void displayMovieDetail(){
int idMovie=(整数)getIntent().getExtras().get(getString(R.string.movie_id));
电影演员名单;
movieList=getIntent().getParcelableArrayListExtra(getString(R.string.movie_lsit));
MovieData MovieData=movieList.get(idMovie);
毕加索.with(mContext).load(基本URL+大小+
将movieData.getPoster())转换为(mMoviePoster);
mMovieTitle.setText(movieData.getTitle());
mReleaseDate.setText(movieData.getReleaseDate());
mAverageVote.setText(Double.toString(movieData.getRating());
mSynopsis.setText(movieData.getSynopsis());
}
}


另外,我想分享github链接,但我应该给你我的个人API密钥。(

你需要在
onCreate()
中启动
AsyncTask
(就像你以前做的那样),然后在
finished()
中获取结果并将它们添加到适配器的数据列表中。 最后,不要忘记调用
notifyDatasetChanged()

@覆盖
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u movie\u details);
//正在跳过此处的一些代码行。。。
mReviewRecycle.setAdapter(mReviewAdapter);
ReviewAsyncTask ReviewAsyncTask=新的ReviewAsyncTask(此);
reviewAsyncTask.execute();
}
@凌驾
已完成公共作废(ArrayList输出){
mReviewList.addAll(输出);
mReviewAdapter.notifyDatasetChanged();
}
(请注意,为了简洁起见,我跳过了空检查和错误处理)

  • 在MovieDetails onCreate中,像在displayMovieDetail中一样检索当前电影ID
  • 将该ID发送到ReviewAsyncTask(您需要修改ReviewAsyncTask的构造函数)
  • 在ReviewAsyncTask中检索id,将其另存为成员变量,然后在doInBackground方法中将该id作为参数发送到buildReviewUrl

  • 到底是什么问题?@plaskoff reviews没有出现…您是否尝试检查响应?是否收到响应?是否在AsyncTask实现中重写onPostExecute()?t
    //JSON for Review
    public static ArrayList<ReviewData> getReviewFromJson(String json) throws JSONException {
        ArrayList<ReviewData> listOfReviews = new ArrayList<>();
    
        try {
            JSONObject reviews = new JSONObject(json);
            JSONArray reviewsArray = reviews.getJSONArray(QUERY_RESULTS);
            for(int i = 0; i < reviewsArray.length(); i++) {
                JSONObject jsonReview = reviewsArray.getJSONObject(i);
                String author = jsonReview.optString(REVIEW_AUTHOR);
                String content = jsonReview.optString(REVIEW_CONTENT);
    
                ReviewData reviewData = new ReviewData(author, content);
    
                listOfReviews.add(reviewData);
            }
        } catch(JSONException e) {
            e.printStackTrace();
            Log.e("ReviewJson", "JSON Review Error");
        }
    
        return listOfReviews;
    }
    
    public class ReviewAsyncTask extends AsyncTask<String, Void, ArrayList<ReviewData>> {
    
    private ReviewData mReviewData;
    
    public interface ReviewResponse {
        void finished(ArrayList<ReviewData> output);
    }
    
    private ReviewResponse reviewResponse = null;
    
    public ReviewAsyncTask(ReviewResponse reviewResponse) {
        this.reviewResponse = reviewResponse;
    }
    
    @Override
    protected ArrayList<ReviewData> doInBackground(String... strings) {
        String rawData = "";
        ArrayList<ReviewData> reviewList = new ArrayList<>();
        try {
            rawData = NetworkUtils.getResponseFromHttpRequest(NetworkUtils
                    .buildReviewUrl(String.valueOf(mReviewData)));
            reviewList = JsonData.getReviewFromJson(rawData);
        } catch (IOException e) {
            e.printStackTrace();
            Log.e("ReviewAsyncTask", "Error in ReviewAsyncTask");
        } catch (JSONException e) {
            e.printStackTrace();
            Log.e("JSONAsync", "JSON problem");
        }
    
        return reviewList;
    }
    
    @Override
    protected void onPostExecute(ArrayList<ReviewData> reviewData) {
        reviewResponse.finished(reviewData);
    
    }
    
    public class MovieDetails extends AppCompatActivity implements ReviewAsyncTask.ReviewResponse {
    
    private final static String BASE_URL = "http://image.tmdb.org/t/p/";
    private final static String SIZE = "w185/";
    
    private ArrayList<ReviewData> mReviewList;
    
    private ReviewAdapter mReviewAdapter;
    
    @BindView(R.id.poster_detail)
    ImageView mMoviePoster;
    @BindView(R.id.title_detail)
    TextView mMovieTitle;
    @BindView(R.id.release_date)
    TextView mReleaseDate;
    @BindView(R.id.average_vote)
    TextView mAverageVote;
    @BindView(R.id.synopsis)
    TextView mSynopsis;
    
    @BindView(R.id.review_recycler)
    RecyclerView mReviewRecycle;
    
    Context mContext;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_movie_details);
        ButterKnife.bind(this);
    
        displayMovieDetail();
    
        //Review RecycleView
        mReviewList = new ArrayList<>();
        mReviewAdapter = new ReviewAdapter(this, mReviewList);
    
        RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this);
        mReviewRecycle.setLayoutManager(layoutManager);
        mReviewRecycle.setHasFixedSize(true);
        mReviewRecycle.setAdapter(mReviewAdapter);
    }
    
    @Override
    public void finished(ArrayList<ReviewData> output) {
        ReviewAsyncTask reviewAsyncTask = new ReviewAsyncTask(this);
        reviewAsyncTask.execute();
    }
    
    /* Method for displaying the info about movies in activity details
     * @param mMoviePoster sets the movie poster
     * @param mMovieTitle sets original title of the movie
     * @param mReleaseDate sets release date of the movie
     * @param mAverageVote sets average rating grade of the movie
     * @param mSynopsis sets plot of the movie */
    private void displayMovieDetail() {
        int idMovie = (Integer) getIntent().getExtras().get(getString(R.string.movie_id));
    
        List<MovieData> movieList;
        movieList = getIntent().getParcelableArrayListExtra(getString(R.string.movie_lsit));
    
        MovieData movieData = movieList.get(idMovie);
    
        Picasso.with(mContext).load(BASE_URL + SIZE +
                movieData.getPoster()).into(mMoviePoster);
        mMovieTitle.setText(movieData.getTitle());
        mReleaseDate.setText(movieData.getReleaseDate());
        mAverageVote.setText(Double.toString(movieData.getRating()));
        mSynopsis.setText(movieData.getSynopsis());
    }
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_movie_details);
        // skipping some lines of code here...
        mReviewRecycle.setAdapter(mReviewAdapter);
        ReviewAsyncTask reviewAsyncTask = new ReviewAsyncTask(this);
        reviewAsyncTask.execute();
    }
    
    @Override
    public void finished(ArrayList<ReviewData> output) {
        mReviewList.addAll(output);
        mReviewAdapter.notifyDatasetChanged();
    }