17

我已经看过很多如何做到这一点的例子,但我不知道如何在我的代码中实现它。

我正在使用此代码
我已经更新了 url,所以它会收到一个带有动态数据的 json。我正在尝试使用此代码每 30 秒自动更新一次列表。

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

它刷新并调用 url 并获取数据,但 UI 没有更新。

感谢您为我指明正确方向的任何提示。

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

4

3 回答 3

22

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

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

如果在您的情况下,任务运行的时间比您想要刷新的 30 秒长得多,那么您需要使用onProgressUpdate()and publishProgress()。否则onPostExecute()应该做的伎俩。

有关如何实现它,请参阅官方文档。

于 2014-06-01T09:47:38.840 回答
8

您可以使用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);
        }

    };
}

更新 不需要在runOnUiThread里面使用onPostExecute,因为它已经被调用并且它的主体在UIThread.

于 2014-06-01T09:44:34.627 回答
1

第一件事是使用 postdelayed() 不会重复运行您的代码如果您想以重复模式运行代码,请使用此代码。这将在每 5 秒后运行一次

  ScheduledExecutorService scheduleTaskExecutor = Executors.newScheduledThreadPool(5);

    /*This schedules a runnable task every second*/
    scheduleTaskExecutor.scheduleAtFixedRate(new Runnable() {
      public void run() 
      {
        runOnUiThread(new Runnable(){

            @Override
            public void run() {
                // TODO Auto-generated method stub
                new GetContacts().execute();
            }

        });
      }
    }, 0, 5, TimeUnit.SECONDS);

您所遵循的代码每次都会在 postExecute() 中创建 SimpleAdapter 的新实例,因此您将一次又一次地看到相同的数据。因此,如果您想更新您的适配器,请创建 SimpleAdapter 实例作为类成员并用这个替换 postExecute()

@Override
        protected void onPostExecute(Void result) {
            super.onPostExecute(result);
            // Dismiss the progress dialog
            if (pDialog.isShowing())
                pDialog.dismiss();
            /**
             * Updating parsed JSON data into ListView
             * */
            if(adapter == null)
            {
                adapter = new SimpleAdapter(
                    MainActivity.this, contactList,
                    R.layout.list_item, new String[] { TAG_NAME, TAG_EMAIL,
                            TAG_PHONE_MOBILE }, new int[] { R.id.name,
                            R.id.email, R.id.mobile });

                            setListAdapter(adapter);
            }
            else
            {
                adapter.notifyDataSetChanged();
            }


        }

现在这将更新适配器,但会添加相同的联系人

于 2014-06-01T10:36:44.993 回答