2012-11-28 31 views
0

如何在从服务数据库更新数据时重新运行加载程序以更新适配器数据?如何在服务器更改数据库时重新运行加载程序

DataPullService:

public class DataPullService extends Service { 


    private Timer nstimer=new Timer(); 

    @Override 
    public IBinder onBind(Intent intent) { 

     return null; 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     NetworkConnection network=new NetworkConnection(this.getApplicationContext()); 
     boolean online = network.isOnline(); 
     if(online){ 
      try { 
       nstimer.scheduleAtFixedRate(new TimerTask() { 
        public void run() { 
         DBHelper dbHelper=new DBHelper(getApplicationContext()); 
         SQLiteDatabase mydb = dbHelper.getWritableDatabase(); 

         ContentValues values=new ContentValues(); 
         values.put(DBConstants.COMPANY, "Innodea"); 

         mydb.insert(DBConstants.FAVORITE_TABLE, null, values); 

        } 
       }, 0, 60000); 
      } catch (Exception e) { 
      } 
     } 
     return startId; 
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     nstimer.cancel(); 
    } 
} 

MyListFragment:

public class MyListFragment extends ListFragment implements LoaderManager.LoaderCallbacks<Cursor> { 


    private SimpleCursorAdapter mAdapter; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) { 
     return super.onCreateView(inflater, container, savedInstanceState); 
    } 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 

     setEmptyText("List loading..."); 
     setHasOptionsMenu(true); 

     mAdapter = new SimpleCursorAdapter(getActivity(), android.R.layout.simple_list_item_2, null, new String[]{DBConstants.SNO,DBConstants.COMPANY}, new int[]{android.R.id.text1,android.R.id.text2}); 

     setListAdapter(mAdapter); 

     getLoaderManager().initLoader(0, null, this); 
    } 

    @Override 
    public Loader<Cursor> onCreateLoader(int arg0, Bundle arg1) { 
     DBHelper dbHelper=new DBHelper(getActivity()); 
     return new LiveMyLoader(getActivity(),dbHelper); 
    } 

    @Override 
    public void onLoadFinished(Loader<Cursor> arg0, Cursor c) { 
     mAdapter.swapCursor(c); 
     setListAdapter(mAdapter); 
    } 

    @Override 
    public void onLoaderReset(Loader<Cursor> arg0) { 
     mAdapter.swapCursor(null); 
    } 


} 

上述代码负载数据时片段created.Then如何更新此列表片段每当在DB改变的数据(由更新DataPullService)?

回答

0

当您想刷新数据时,请在您的Loader上拨打getLoaderManager().restartLoader()restartLoader将触发onCreateLoader再次被调用。在这种情况下,它将加载新的数据。

+1

是的,如何从Service.getLoaderManager中调用getLoaderManager仅在Activity和fragment中可用 – Ramprasad

+1

是的,如何从服务重启Loader – Ramprasad

0

1在类中创建静态列表。 2加载数据列表。 3重载,只要更改数据库中的表(Observer模式) 4调用notifyDatasetChanged()(您的观察者的更新())重新加载列表中的每个时间 注:用无尽的阵列适配器

1

我有在MyListFragment中添加了BroadcastReceiver,并在onReceive方法中重新启动了Loader。

在MyListFragment-onActivityCreated:

mycontext=this; 
getActivity().registerReceiver(FragmentReceiver1, new IntentFilter("fragmentupdater")); 

在MyListFragment

private final BroadcastReceiver FragmentReceiver1 = new BroadcastReceiver() { 

     @Override 
     public void onReceive(Context context, Intent intent) { 
      getLoaderManager().restartLoader(0, null, mycontext); 
      Log.i("timer", "Broadcast received"); 
     }}; 

在MyListFragment-onDestroyView:

@Override 
    public void onDestroyView() { 
     super.onDestroyView(); 
     getActivity().unregisterReceiver(FragmentReceiver1); 


} 

在DataPullService:

Intent intent=new Intent("fragmentupdater"); 
sendBroadcast(intent); 

现在,只要在DB服务更新数据时,broadscast接收器接收并重新启动加载器。

注意:在Android清单文件中注册接收器。

+0

该方法是否正确?我读了一些页面,说不使用广播接收器中的片段上下文? – Ramprasad

+0

有时我收到ANR错误信息,而广播接收机试图接收... – Ramprasad

+0

我喜欢这个,如果它的工作,因为这意味着我不需要做组件之间的某种硬连接。 –

相关问题