Java 异步任务-缺少某些内容
我在做一个项目,我被卡住了。。。我做错了什么,可能是AsyncTask,我不知道该修复什么以及如何修复。。。。我现在有代码 ReviewData.classJava 异步任务-缺少某些内容,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.
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();
}
(请注意,为了简洁起见,我跳过了空检查和错误处理)
到底是什么问题?@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();
}