【问题标题】:Onpostexecute wont update the textviewOnpostexecute 不会更新文本视图
【发布时间】:2017-08-27 03:59:50
【问题描述】:

我正在创建一个目录电影应用程序,我在 detailactivity 上有问题,我的问题是,当我点击第一部电影时,它成功显示电影详细信息,然后我按下返回按钮,然后我点击另一部电影,但是它仍然显示我单击的第一部电影详细信息,我看到了日志、标题和任何内容,已更新,但活动中的文本视图未更新,我该如何解决这个问题?

详细活动

public class DetailActivity extends AppCompatActivity {

TextView txt_title,txt_desc,txt_release;
ImageView img_posterd;

private Context context;


public static List<String> LIST = new ArrayList<String>();

public static String API_KEY = "f00e74c69ff0512cf9e5bf12856******";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_detail);



    Intent i = getIntent();
    String idmov = i.getStringExtra("idmovie");

    String url = "https://api.themoviedb.org/3/movie/"+idmov+"?api_key="+API_KEY+"&language=en-US";
    txt_title = (TextView) findViewById(R.id.tv_title_detail);
    txt_desc = (TextView) findViewById(R.id.tv_desc_detail);
    txt_release = (TextView) findViewById(R.id.tv_release);
    img_posterd = (ImageView) findViewById(R.id.img_poster_detail);
    new GetMovieTask(txt_title,txt_desc,txt_release,img_posterd).execute(url);


}

private class GetMovieTask extends AsyncTask<String, List<String>, List<String>>{

    TextView txt_title,txt_desc,txt_release;
    ImageView img_poster;

    public GetMovieTask(TextView txt_title, TextView txt_desc, TextView txt_release,ImageView img_poster) {

        this.txt_title = txt_title;
        this.txt_desc = txt_desc;
        this.txt_release = txt_release;
        this.img_poster = img_poster;

    }

    @Override
    protected List<String> doInBackground(String... strings) {

        String title;
        String desc;
        String release;
        String posterUrl;

        try {
            URL url = new URL(strings[0]);
            HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();

            InputStream stream = new BufferedInputStream(urlConnection.getInputStream());
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(stream));
            StringBuilder builder = new StringBuilder();

            String inputString;
            while ((inputString = bufferedReader.readLine()) != null) {
                builder.append(inputString);
            }


            JSONObject object = new JSONObject(builder.toString());
            title = String.valueOf(object.getString("title"));
            desc = String.valueOf(object.getString("overview"));
            release = String.valueOf(object.getString("release_date"));
            posterUrl = String.valueOf(object.getString("backdrop_path"));
            String finalPos = posterUrl = POSTER_BASE_URL + "original" + posterUrl;

            LIST.add(title);
            LIST.add(desc);
            LIST.add(release);
            LIST.add(finalPos);

            Log.d("titlenya", title);
            Log.d("desc", desc);
            Log.d("release", release);
            Log.d("posterUrl", finalPos);

            urlConnection.disconnect();


        }catch (IOException | JSONException e){
            e.printStackTrace();
        }
        return LIST;

    }


    @Override
    protected void onPostExecute(List<String> result) {
        super.onPostExecute(result);
        String title = result.get(0);
        String desc = result.get(1);
        String release = result.get(2);
        String poster = result.get(3);
        txt_title.setText("Title : " +title);
        txt_desc.setText("Description : " +desc);
        txt_release.setText("Release Date : " +release);
        Picasso.with(context).load(poster).into(img_posterd);

    }

}

【问题讨论】:

  • 请记录您在附加项中获得的 idmov,检查它是否是正确的值。
  • 再次检查我的问题,我已经添加了图片
  • 你有什么异常吗?以防万一您在 logcat 中添加了任何过滤器,请将其删除并再次观察
  • 不,我没有得到任何异常

标签: android json android-asynctask textview


【解决方案1】:

您好,请查找 DetailActivity.java 的更新版本

public class DetailActivity extends AppCompatActivity {

TextView txt_title, txt_desc, txt_release;
ImageView img_posterd;

public static String API_KEY = "******";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_detail);

    Intent i = getIntent();
    String idmov = i.getStringExtra("idmovie");
    String url = "https://api.themoviedb.org/3/movie/" + idmov + "?api_key=" + API_KEY + "&language=en-US";
    txt_title = (TextView) findViewById(R.id.tv_title_detail);
    txt_desc = (TextView) findViewById(R.id.tv_desc_detail);
    txt_release = (TextView) findViewById(R.id.tv_release);
    img_posterd = (ImageView) findViewById(R.id.img_poster_detail);
    new GetMovieTask().execute(url);
}

private class GetMovieTask extends AsyncTask<String, List<String>, List<String>> {

    @Override
    protected List<String> doInBackground(String... strings) {
        List<String> detailsList = new ArrayList<>();
        String title;
        String desc;
        String release;
        String posterUrl;

        try {
            URL url = new URL(strings[0]);
            HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
            InputStream stream = new BufferedInputStream(urlConnection.getInputStream());
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(stream));

            StringBuilder builder = new StringBuilder();
            String inputString;

            while ((inputString = bufferedReader.readLine()) != null) {
                builder.append(inputString);
            }

            JSONObject object = new JSONObject(builder.toString());
            title = String.valueOf(object.getString("title"));
            desc = String.valueOf(object.getString("overview"));
            release = String.valueOf(object.getString("release_date"));
            posterUrl = String.valueOf(object.getString("backdrop_path"));
            String finalPos = posterUrl = "http://image.tmdb.org/t/p/" + "original" + posterUrl;

            detailsList.add(title);
            detailsList.add(desc);
            detailsList.add(release);
            detailsList.add(finalPos);

            Log.d("titlenya", title);
            Log.d("desc", desc);
            Log.d("release", release);
            Log.d("posterUrl", finalPos);

            urlConnection.disconnect();

        } catch (IOException | JSONException e) {
            e.printStackTrace();
        }
        return detailsList;
    }

    @Override
    protected void onPostExecute(List<String> result) {
        super.onPostExecute(result);
        String title = result.get(0);
        String desc = result.get(1);
        String release = result.get(2);
        String poster = result.get(3);
        txt_title.setText("Title : " + title);
        txt_desc.setText("Description : " + desc);
        txt_release.setText("Release Date : " + release);
      Picasso.with(DetailActivity.this).load(poster).into(img_posterd);
    }
}
}

您使用的是静态 LIST,这就是问题的原因。您正在获取 LIST.get(0),LIST.get(1) 之类的详细信息......因此,由于列表是静态的,因此之前的数据仍然存在,并且您始终可以获得您打开的第一部电影的详细信息。

此外,您已经将所有文本视图和图像视图作为全局对象,因此无需将它们传递给 AsyncTask 的构造函数

【讨论】:

  • 我已经分享了上面的解决方案,并对其进行了测试,并且按预期工作。请通过解决方案。删除静态 LIST 并在 AsyncTask 的 doInBackground 中创建一个列表很简单,还删除了将不必要的视图传递给的构造函数。
  • NICE ONE SIR,它的工作thx :),但我不完全理解,当你说“你使用的是静态列表,这就是问题的原因”,,你能解释一下吗更多??
  • 公共静态列表 LIST = new ArrayList();这条线导致了你不应该使用静态列表的问题,它会留在内存中。它是一个类变量,这意味着它只为每个类而不是实例实例化一次。因此,对于创建的每个实例,您的详细活动都将具有相同的 LIST。希望你现在明白了。如果您对此有任何疑问,请通过javatpoint.com/static-keyword-in-java
  • 好的,先生,再问一个问题,你可以解释更多关于“你已经拥有所有的文本视图和图像视图作为全局对象,所以不需要将它们传递给 AsyncTask 的构造函数”,我只是发现,这种方式会起作用:D
  • 您的内部 Asynctask 类已经可以访问它们,请在tutorialspoint.com/java/java_variable_types.htm阅读更多内容
猜你喜欢
  • 2021-07-05
  • 1970-01-01
  • 1970-01-01
  • 2019-07-04
  • 1970-01-01
  • 2013-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多