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 と対話できる 3 つの保護されたメソッドがあります。

  • onPreExecute()
    • 前に走る doInBackground()
  • onPostExecute()
    • 完了 に実行doInBackground()
  • onProgressUpdate()
    • doInBackground()これは、で呼び出したときにのみ実行されますpublishProgress()

あなたの場合、更新したい 30 秒よりもずっと長く Task が実行される場合は、onProgressUpdate()andを利用したいと思うでしょうpublishProgress()。そうonPostExecute()でなければ、トリックを行う必要があります。

実装方法は公式ドキュメントを参照してください。

于 2014-06-01T09:47:38.840 に答える
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 に答える