我有点麻烦,因为我对Android开发有点新手。我试图读取传感器数据,暂时将数据保存到数据库,然后批量插入我创建的服务器,以便我可以在线显示数据。
我的活动是SensorEventListener
,我将每个事件的值写入TextView
。我正好阅读事件数据。我认为过于频繁地向服务器发送数据可能是一个问题,所以我决定通过单击菜单按钮启动将数据保存到我的Android应用程序的内部数据库,并从中获取数据。内部数据库并使用不同的菜单按钮将其发送到我的服务器。
我的onSensorChanged(SensorEvent event)
方法如下:
@Override
public void onSensorChanged(SensorEvent event) {
// Accuracy is handled in the onAccuracy Changed ( - 1 )
for (int i = 0; i < mTextViews.length - 1; i++) {
mTextViews[i].setText("Value " + i + ": " + event.values[i]);
}
if (mSensorEvents == null) mSensorEvents = new ArrayList<>();
if (mSensorEvents.size() < VALS_MAX) {
mSensorEvents.add(event);
} else {
mSensorManager.unregisterListener(this);
new SensorEventLoggerTask().execute(mSensorEvents);
}
}
正如我之前所说,保存和发送操作是通过菜单按钮启动的,这是我处理的地方:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.action_save_data) {
mSensorManager.unregisterListener(this);
new SensorEventLoggerTask().execute(mSensorEvents);
} else if (id == R.id.action_send_data) {
new SendSensorDataTask().execute();
}
return super.onOptionsItemSelected(item);
}
这些任务看起来像这样:
private class SensorEventLoggerTask extends AsyncTask<List<SensorEvent>, Void, Void> {
@Override
protected Void doInBackground(List<SensorEvent>... events) {
for (int i = 0; i < events.length; i++) {
SensorEvent event = events[0].get(i);
String value = Arrays.toString(event.values);
long timestamp = (new Date()).getTime() + (event.timestamp - System.nanoTime()) / 100000L;
ContentValues values = new ContentValues();
values.put(SensorDataHelper.COL_ACCURACY, event.accuracy);
values.put(SensorDataHelper.COL_NAME, mSensorName);
// TODO: get the email from the user
values.put(SensorDataHelper.COL_EMAIL, "jakehockey10@gmail.com");
values.put(SensorDataHelper.COL_TIMESTAMP, timestamp);
values.put(SensorDataHelper.COL_VALUE, value);
getActivity().getContentResolver().insert(SensorDataProvider.CONTENT_URI, values);
}
return null;
}
}
和...
private class SendSensorDataTask extends AsyncTask<String, String, String> {
private List<HashMap<String, String>> mData = null; // post data
/**
* constructor
*/
public SendSensorDataTask(){}
/**
* background
*/
@Override
protected String doInBackground(String... params) {
Cursor query = getActivity().getContentResolver().query(SensorDataProvider.CONTENT_URI, null, null, null, null);
return null;
}
}
我的SensorDataProvider
课程中的查询方法只是这样做:
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
String sortOrder) {
Cursor cursor = getDatabase(false).rawQuery("select * from table", null);
return cursor;
}
正如您所看到的,我还没有发布帖子请求,但那是因为我不太确定该怎么做,尽管我已经找到了一些例子线上。但我无法获取我已经添加到内部数据库中的记录,如果我能解决这个问题,我的下一步就是从这些记录中创建JSON
个对象并创建一个{ {1}}请求。
从你看到的,你有什么建议吗?我是以正确的方式接近这个吗?我搞砸了哪里?如果您需要我发布任何更多的片段,请告诉我。我真的很感激一些指导...