【问题标题】:refresh activity after receiving the response from the background service收到后台服务的响应后刷新活动
【发布时间】:2015-06-13 03:01:25
【问题描述】:

我正在开发一个应用程序,我使用后台服务向服务器发送请求,然后将响应存储在数据库中并动态显示数据,因为从后台服务接收答案并将它们保存在数据库中,知道我正在使用一个

ListView

显示来自数据库的数据。每次在数据库中保存新数据时如何刷新活动? 我已经尝试在单击后显示数据它正在工作我如何动态地做到这一点?

【问题讨论】:

  • 可以通过Listview Notifydatasetchanged方法实现
  • @Hardipatel 我使用了 Notifydatasetchanged 但在 onclick 但在动态显示中我不确定在哪里使用它以及如何使用它你能帮我吗谢谢
  • 尝试使用 AsyncTask 从 Web 获取数据并存储 DB 并在数据插入 DB 后通知您的 ListView onPostExecute:developer.android.com/reference/android/os/AsyncTask.html
  • 您可以通过后台任务的 onpostexecute 方法来完成

标签: android android-activity android-listview service background-service


【解决方案1】:

假设您使用的是真正的服务或不是 AsyncTask。

使用BroadcastReceiver 模式。 在您的服务中发送广播。

LocalBroadcastManager.getInstance(context).sendBroadcast(new Intent("data_changed"));

在包含您的列表视图的活动中声明您的接收者

  private BroadcastReceiver dataChangeReceiver= new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        // update your listview
    }
};

注册和注销

    @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    IntentFilter inF = new IntentFilter("data_changed");
    LocalBroadcastManager.getInstance(this).registerReceiver(dataChangeReceiver,inF);



}
 @Override
protected void onPause() {
    super.onPause();
    LocalBroadcastManager.getInstance(this).unregisterReceiver(dataChangeReceiver);
}

【讨论】:

    【解决方案2】:

    试试CursorLoader。 Loader 监控数据源并在内容发生变化时带来新的结果。

    来自official reference的例子

    这是显示 ListView 的 Fragment 的完整实现 包含针对联系人内容的查询结果 提供者。它使用 CursorLoader 来管理提供程序上的查询

    public static class CursorLoaderListFragment extends ListFragment
            implements OnQueryTextListener, OnCloseListener,
            LoaderManager.LoaderCallbacks<Cursor> {
    
        // This is the Adapter being used to display the list's data.
        SimpleCursorAdapter mAdapter;
    
        // The SearchView for doing filtering.
        SearchView mSearchView;
    
        // If non-null, this is the current filter the user has provided.
        String mCurFilter;
    
        @Override public void onActivityCreated(Bundle savedInstanceState) {
            super.onActivityCreated(savedInstanceState);
    
            // Give some text to display if there is no data.  In a real
            // application this would come from a resource.
            setEmptyText("No phone numbers");
    
            // We have a menu item to show in action bar.
            setHasOptionsMenu(true);
    
            // Create an empty adapter we will use to display the loaded data.
            mAdapter = new SimpleCursorAdapter(getActivity(),
                    android.R.layout.simple_list_item_2, null,
                    new String[] { Contacts.DISPLAY_NAME, Contacts.CONTACT_STATUS },
                    new int[] { android.R.id.text1, android.R.id.text2 }, 0);
            setListAdapter(mAdapter);
    
            // Start out with a progress indicator.
            setListShown(false);
    
            // Prepare the loader.  Either re-connect with an existing one,
            // or start a new one.
            getLoaderManager().initLoader(0, null, this);
        }
    
        public static class MySearchView extends SearchView {
            public MySearchView(Context context) {
                super(context);
            }
    
            // The normal SearchView doesn't clear its search text when
            // collapsed, so we will do this for it.
            @Override
            public void onActionViewCollapsed() {
                setQuery("", false);
                super.onActionViewCollapsed();
            }
        }
    
        @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
            // Place an action bar item for searching.
            MenuItem item = menu.add("Search");
            item.setIcon(android.R.drawable.ic_menu_search);
            item.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM
                    | MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW);
            mSearchView = new MySearchView(getActivity());
            mSearchView.setOnQueryTextListener(this);
            mSearchView.setOnCloseListener(this);
            mSearchView.setIconifiedByDefault(true);
            item.setActionView(mSearchView);
        }
    
        public boolean onQueryTextChange(String newText) {
            // Called when the action bar search text has changed.  Update
            // the search filter, and restart the loader to do a new query
            // with this filter.
            String newFilter = !TextUtils.isEmpty(newText) ? newText : null;
            // Don't do anything if the filter hasn't actually changed.
            // Prevents restarting the loader when restoring state.
            if (mCurFilter == null && newFilter == null) {
                return true;
            }
            if (mCurFilter != null && mCurFilter.equals(newFilter)) {
                return true;
            }
            mCurFilter = newFilter;
            getLoaderManager().restartLoader(0, null, this);
            return true;
        }
    
        @Override public boolean onQueryTextSubmit(String query) {
            // Don't care about this.
            return true;
        }
    
        @Override
        public boolean onClose() {
            if (!TextUtils.isEmpty(mSearchView.getQuery())) {
                mSearchView.setQuery(null, true);
            }
            return true;
        }
    
        @Override public void onListItemClick(ListView l, View v, int position, long id) {
            // Insert desired behavior here.
            Log.i("FragmentComplexList", "Item clicked: " + id);
        }
    
        // These are the Contacts rows that we will retrieve.
        static final String[] CONTACTS_SUMMARY_PROJECTION = new String[] {
            Contacts._ID,
            Contacts.DISPLAY_NAME,
            Contacts.CONTACT_STATUS,
            Contacts.CONTACT_PRESENCE,
            Contacts.PHOTO_ID,
            Contacts.LOOKUP_KEY,
        };
    
        public Loader<Cursor> onCreateLoader(int id, Bundle args) {
            // This is called when a new Loader needs to be created.  This
            // sample only has one Loader, so we don't care about the ID.
            // First, pick the base URI to use depending on whether we are
            // currently filtering.
            Uri baseUri;
            if (mCurFilter != null) {
                baseUri = Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI,
                        Uri.encode(mCurFilter));
            } else {
                baseUri = Contacts.CONTENT_URI;
            }
    
            // Now create and return a CursorLoader that will take care of
            // creating a Cursor for the data being displayed.
            String select = "((" + Contacts.DISPLAY_NAME + " NOTNULL) AND ("
                    + Contacts.HAS_PHONE_NUMBER + "=1) AND ("
                    + Contacts.DISPLAY_NAME + " != '' ))";
            return new CursorLoader(getActivity(), baseUri,
                    CONTACTS_SUMMARY_PROJECTION, select, null,
                    Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC");
        }
    
        public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
            // Swap the new cursor in.  (The framework will take care of closing the
            // old cursor once we return.)
            mAdapter.swapCursor(data);
    
            // The list should now be shown.
            if (isResumed()) {
                setListShown(true);
            } else {
                setListShownNoAnimation(true);
            }
        }
    
        public void onLoaderReset(Loader<Cursor> loader) {
            // This is called when the last Cursor provided to onLoadFinished()
            // above is about to be closed.  We need to make sure we are no
            // longer using it.
            mAdapter.swapCursor(null);
        }
    }
    

    【讨论】:

    • 欢迎来到 Stack Overflow!请引用链接中最相关的部分,以防目标站点无法访问或永久离线。见How do I write a good answer
    【解决方案3】:
     You can refresh the data of activity by using Broadcast receiver. To update 
     the view in UI you can go for .invalidate() in the view which you want to refresh. For Example
      RelativeLayout slidingUpLayout=(RelativeLayout) view.findViewById(R.id.slidingLayout);
      slidingUpLayout.invalidate();
    

    现在无论这个 relativelayout 中的 Button、Imageview 等组件如何,都将重新绘制以刷新最新更新。看看@这个 Related quesHow android drawsInvalidate()requestLayout()

    【讨论】:

      猜你喜欢
      • 2014-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-27
      • 1970-01-01
      • 2021-06-05
      相关资源
      最近更新 更多