Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java AsyncTask不返回任何值_Java_Android_Json_Android Asynctask - Fatal编程技术网

Java AsyncTask不返回任何值

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

我有一个适配器类和一个模型类,它们工作得很好。我认为内部AsyncTask有问题,我无法将json的结果显示在主活动上。请帮忙

我还包括了json响应的外观

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();
}
}