Java AsyncTask不返回任何值
我有一个适配器类和一个模型类,它们工作得很好。我认为内部AsyncTask有问题,我无法将json的结果显示在主活动上。请帮忙 我还包括了json响应的外观Java AsyncTask不返回任何值,java,android,json,android-asynctask,Java,Android,Json,Android Asynctask,我有一个适配器类和一个模型类,它们工作得很好。我认为内部AsyncTask有问题,我无法将json的结果显示在主活动上。请帮忙 我还包括了json响应的外观 public class MainActivity extends AppCompatActivity { public ArrayList<NetworkUtils> moviesList = new ArrayList<>(); private RecyclerView mRecyclerView; priva
public class MainActivity extends AppCompatActivity {
public ArrayList<NetworkUtils> moviesList = new ArrayList<>();
private RecyclerView mRecyclerView;
private MoviesAdapter mMoviesAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mRecyclerView = (RecyclerView) findViewById(R.id.rv_main_activity);
mRecyclerView.setHasFixedSize(true);
mRecyclerView.setLayoutManager(new GridLayoutManager(this, 2));
mMoviesAdapter = new MoviesAdapter(this);
mRecyclerView.setAdapter(mMoviesAdapter);
mMoviesAdapter.setMoviesList(moviesList);
new FetchMoviesTask().execute("my url goes here");
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
public class FetchMoviesTask extends AsyncTask<String, Void, List<NetworkUtils>> {
@Override
public List<NetworkUtils> doInBackground(String... params) {
HttpURLConnection connection = null;
BufferedReader reader = null;
String json;
try {
URL url = new URL(params[0]);
connection = (HttpURLConnection) url.openConnection();
connection.connect();
InputStream stream = connection.getInputStream();
StringBuffer buffer = new StringBuffer();
reader = new BufferedReader(new InputStreamReader(stream));
json = buffer.toString();
JSONObject parentObject = new JSONObject(json);
JSONArray parentArray = parentObject.getJSONArray("results");
for (int i = 0; i < parentArray.length(); i++) {
JSONObject finalObject = parentArray.getJSONObject(i);
NetworkUtils tmdbMovies = new NetworkUtils();
tmdbMovies.setTitle(finalObject.getString("title"));
moviesList.add(tmdbMovies);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (connection != null) {
connection.disconnect();
}
try {
if (reader != null) {
reader.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return moviesList;
}
@Override
public void onPostExecute(List<NetworkUtils> moviesList) {
super.onPostExecute(moviesList);
}
}}
适配器类
public class MoviesAdapter extends
RecyclerView.Adapter<MoviesAdapter.MoviesViewHolder> {
private List<NetworkUtils> moviesList = new ArrayList<>();
private Context context;
public class MoviesViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
private TextView titleTextView;
public MoviesViewHolder(View itemView) {
super(itemView);
titleTextView = (TextView) itemView.findViewById(R.id.movie_title);
itemView.setOnClickListener(this);
}
@Override
public void onClick(View itemView) {
Context context = itemView.getContext();
Intent showMovieIntent = new Intent(context, MainActivity.class);
context.startActivity(showMovieIntent);
}
}
public MoviesAdapter(List<NetworkUtils> moviesList) {
this.moviesList = moviesList;
}
public MoviesAdapter(MainActivity mainActivity) {
}
@Override
public MoviesViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.image_layout, parent, false);
return new MoviesViewHolder(view);
}
@Override
public void onBindViewHolder(MoviesViewHolder holder, int position) {
NetworkUtils movies = moviesList.get(position);
TextView mTextView = holder.titleTextView;
mTextView.setText(movies.getTitle());
}
@Override
public int getItemCount() {
if (moviesList == null)
return 0;
return moviesList.size();
}
public void setMoviesList(ArrayList<NetworkUtils> mMoviesList) {
moviesList = mMoviesList;
notifyDataSetChanged();
}
}
公共类MoviesAdapter扩展
RecyclerView.适配器{
private List moviesList=new ArrayList();
私人语境;
公共类MoviesViewHolder扩展了RecyclerView.ViewHolder实现了View.OnClickListener{
私有文本视图titleTextView;
公共电影视图持有者(视图项视图){
超级(项目视图);
titleTextView=(TextView)itemView.findViewById(R.id.movie\u title);
setOnClickListener(这个);
}
@凌驾
公共void onClick(视图项视图){
Context=itemView.getContext();
意图showMovieIntent=新意图(上下文,MainActivity.class);
背景。startActivity(showMovieIntent);
}
}
公共MoviesAdapter(列表moviesList){
this.moviesList=moviesList;
}
公共电影适配器(MainActivity MainActivity){
}
@凌驾
public MoviesViewHolder onCreateViewHolder(视图组父级,int-viewType){
View=LayoutInflater.from(parent.getContext())
.充气(R.layout.image_layout,父级,false);
返回新的MoviesViewHolder(视图);
}
@凌驾
BindViewHolder上的公共无效(MoviesViewHolder,内部位置){
NetworkUtils movies=moviesList.get(位置);
text视图mTextView=holder.titleTextView;
mTextView.setText(movies.getTitle());
}
@凌驾
public int getItemCount(){
if(moviesList==null)
返回0;
返回moviesList.size();
}
public void setMoviesList(数组列表mMoviesList){
moviesList=mMoviesList;
notifyDataSetChanged();
}
}
您希望显示什么以及如何显示?在onPostExecute()
中调用适配器上的notifyDataSetChanged()
会有帮助。我需要在gridview中显示所有标题的名称。同时显示适配器代码。我编辑了我的问题以包含适配器类。您不应该在后台线程中更新数据源,请参见此处:,创建一个新列表,该列表将被传递到onPostExecute()
,并使用addAll()
方法更新moviesList
数据源,然后在适配器上调用notifyDataSetChanged()
。
public class MoviesAdapter extends
RecyclerView.Adapter<MoviesAdapter.MoviesViewHolder> {
private List<NetworkUtils> moviesList = new ArrayList<>();
private Context context;
public class MoviesViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
private TextView titleTextView;
public MoviesViewHolder(View itemView) {
super(itemView);
titleTextView = (TextView) itemView.findViewById(R.id.movie_title);
itemView.setOnClickListener(this);
}
@Override
public void onClick(View itemView) {
Context context = itemView.getContext();
Intent showMovieIntent = new Intent(context, MainActivity.class);
context.startActivity(showMovieIntent);
}
}
public MoviesAdapter(List<NetworkUtils> moviesList) {
this.moviesList = moviesList;
}
public MoviesAdapter(MainActivity mainActivity) {
}
@Override
public MoviesViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.image_layout, parent, false);
return new MoviesViewHolder(view);
}
@Override
public void onBindViewHolder(MoviesViewHolder holder, int position) {
NetworkUtils movies = moviesList.get(position);
TextView mTextView = holder.titleTextView;
mTextView.setText(movies.getTitle());
}
@Override
public int getItemCount() {
if (moviesList == null)
return 0;
return moviesList.size();
}
public void setMoviesList(ArrayList<NetworkUtils> mMoviesList) {
moviesList = mMoviesList;
notifyDataSetChanged();
}
}