如何从asynctask更新ui

Bjo*_*orn 14 android android-asynctask android-handler android-json

我已经看过很多如何做到这一点的例子,但我无法想象如何在我的代码中实现它.

我用这个代码.
我已经更新了url,因此它会收到一个包含动态数据的json.我要做的是使用此代码每30秒自动更新一次列表.

Handler handler = new Handler();
    Runnable refresh = new Runnable() {
        public void run() {
            new GetContacts().execute();
            handler.postDelayed(refresh, 30000); 
        }
    };
Run Code Online (Sandbox Code Playgroud)

它刷新,并调用url并获取数据,但UI不会更新.

感谢任何有助于我朝着正确方向前进的提示.

http://www.androidhive.info/2012/01/android-json-parsing-tutorial/

ind*_*ble 19

在AsyncTask中有三个可以与UI交互的受保护方法.

  • onPreExecute()
    • 之前运行 doInBackground()
  • onPostExecute()
    • 完成 运行doInBackground()
  • onProgressUpdate()
    • 这只在doInBackground()调用它时运行publishProgress()

如果在你的情况下,任务运行的时间超过你要刷新的30秒,那么你会想要使用onProgressUpdate()publishProgress().否则onPostExecute()应该做的伎俩.

有关如何实现它的信息,请参阅官方文档.


Kha*_*ela 7

您可以在内部使用AsycTask和更新list ui任务onPostExecute.

    new AsyncTask<String, String, String>() {
        /**
         * Before starting background do some work.
         * */
        @Override
        protected void onPreExecute() {
        }

        @Override
        protected String doInBackground(String... params) {
            // TODO fetch url data do bg process.
            return null;
        }

        /**
         * Update list ui after process finished.
         */
        protected void onPostExecute(String result) {
               // NO NEED to use activity.runOnUiThread(), code execute here under UI thread. 

                 // Updating parsed JSON data into ListView
                 final List data = new Gson().fromJson(result);
                // updating listview
                ((ListActivity) activity).updateUI(data);
        }

    };
}
Run Code Online (Sandbox Code Playgroud)

更新 不需要在runOnUiThread内部使用onPostExecute,因为它已经被调用并且它的主体被执行了UIThread.

  • 你不需要在`onPostExecute()`中使用`runOnUiThread()`.它已经做到了. (20认同)