使用AsyncTask更新UI

时间:2013-11-05 08:48:33

标签: android android-asynctask

实施AsyncTask时遇到问题。我必须旋转手机以获取最新信息。以下是我的课程:

GamerObject gamer;
….

@Override
protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      ip = "134.188.204.155";
      // Set the name of the gamer
      gamername = (TextView) findViewById(R.id.gamer_name);
      // Set the gamerstatus:
      gamerstatus = (TextView) findViewById(R.id.tvgamer_status_msg);
      // set the job status
      jobstatus = (TextView) findViewById(R.id.tvJob_status_msg);
      new Operation().execute();
 }

private class Operation extends AsyncTask<Void, Void, Void> {

     @Override
     protected Void doInBackground(Void... params) {
        gamer= new GamerObject(ip);
        gamer.UpdateAllData();
     }

    @Override
    protected void onPostExecute(Void result) {
       updateUI();
    }
}

private void updateUI() {
    gamer.updateAllData();
    // Set the name of the gamer
    TextView gamername = (TextView) findViewById(R.id.gamer_name );
    gamername.setText(gamer.gamername);
    gamername = gamer.gamername ;
    // Set the gamer status:
     …
    // set the job status
     …
}

在我使用Intent刷新界面之前,现在我想尝试使用AsyncTask以便它可以与Android版本4兼容。任何人都知道如何在不旋转手机的情况下更新信息?

修改
如果我没有错,为什么我的UI在没有新值的情况下不会刷新,这是因为new Operation().execute();仅在onCreate中使用一次。如果调用了onCreate,则会执行AsyncTask,这意味着每次旋转手机时都会进入onCreate。有谁知道如何保持AsyncTask执行?

2 个答案:

答案 0 :(得分:1)

AsyncTask只会被执行一次,所以每当系统调用onCreate对你的活动进行一些生命周期事件时,就会执行asyncTask。

一种简单但天真的方法是创建新的Thread并使用Handler更新您的用户界面。可以找到更多信息,例如。 here,当然还有Android doc

更好的方法,但更复杂的是使用LoaderLoaderCallback以及ContentProvider作为@metter提到的。这将需要实现您自己的ContentProvider并强制您向应用添加更多“抽象层”,但允许将网络基本代码和ui代码分开。

所以这一直是一个艰难的决定,要么使用“简单”,要么使用带有线程的“ugle”解决方案,或者使用ContentProvier

的“更难”而优雅的解决方案

答案 1 :(得分:0)

  

我希望自动更新inofrmation而无需旋转手机。

这样做需要更多的工作。不幸的是,我们无法看到您的异步任务实际上做了什么。如果它正在从数据库中读取数据,并且您不希望UI通知数据库的任何更改,那么您的内容解析器可以调用它的notifyChange,您的Activity将监听这些更改,然后再次调用异步任务。为此,您将使用Content Observer。但是,如果您的任务是从Web下载数据,那么有两种方法可以在线更改数据时获取通知。一种称为轮询,意味着您定期连接并检查服务器。由于电池,性能和数据流量的限制,您不应该在移动设备上执行此操作。另一种叫做推送,需要你设置一些infrastructure

我希望能帮助你。