0

我在实施时遇到问题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 执行?

4

2 回答 2

1

AsyncTask只会执行一次,因此每当系统由于某些生命周期事件而对您的活动调用 onCreate 时,都会执行 asyncTask。

一种简单但幼稚的方法是创建一个新的Thread并用于Handler更新您的 UI。可以找到更多信息,例如。在这里,当然在 Android doc中。

更好的方法,但更复杂的是使用LoaderLoaderCallbackContentProvider@metter 提到的一起使用。这将需要您自己实现ContentProvider并强制您向应用程序添加更多“抽象层”,但允许分离网络基础代码和 ui 代码。

所以这总是一个艰难的决定,要么使用线程的“简单”但丑陋的解决方案,要么使用“更难”但优雅的解决方案ContentProvier

于 2013-11-05T21:34:46.443 回答
0

我想自动更新信息,而不必旋转手机。

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

我希望这对你有帮助。

于 2013-11-05T11:01:19.797 回答