目前我有一个类按钮按下时向服务器发送数据,我希望自动化这项服务,这样每4小时就可以将数据发送到服务器而无需按下按钮。 POST服务目前正在后台工作,任何指针??我是否必须实现一个定时器没有线索它的我的境界?在此先感谢!!
Button btnCreateUser = (Button) findViewById(R.id.btnSend);
// button click event
btnCreateUser.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
// creating new product in background thread
new CreateNewUser().execute();
}
});
}
class CreateNewUser extends AsyncTask<String, String, String> {
@Override
protected String doInBackground(String... args) {
String lat=latitude, lng=longitude;
SimpleDateFormat sdfDateTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.US);
String newtime = sdfDateTime.format(new Date(System.currentTimeMillis()));
EditText username = (EditText) findViewById(R.id.myText);
String newString= (String)username.getText().toString();
String created_at=newtime;
String timezone="UTC";
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost(url_create_user);
String responseBody = "";
HttpResponse response = null;
try {
String base64EncodedCredentials = "Basic " + Base64.encodeToString(
(username + ":" + created_at +":"+timezone+":"+lat+":"+lng).getBytes(),
Base64.NO_WRAP);
httppost.setHeader("Authorization", base64EncodedCredentials);
httppost.setHeader(HTTP.CONTENT_TYPE,"application/json");
JSONObject obj = new JSONObject();
obj.put("username", String.valueOf(newString));
obj.put("created_at",String.valueOf(newtime));
obj.put("timezone", String.valueOf(timezone));
obj.put("lat", String.valueOf(latitude));
obj.put("lng", String.valueOf(longitude));
httppost.setEntity(new StringEntity(obj.toString(), "UTF-8"));
// Execute HTTP Post Request
response = httpclient.execute(httppost);
if (response.getStatusLine().getStatusCode() == 200) {
Log.d("response ok", "Reached Server ok");
startActivity(new Intent("com.xxxxx.CLEARSCREEN"));
} else {
Log.d("response not ok", "Something went wrong :/");
}
responseBody = EntityUtils.toString(response.getEntity());
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
catch (JSONException e) {
e.printStackTrace();
}
return responseBody;
}
答案 0 :(得分:1)
您可以通过以下代码解决问题:
Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
public void run() {
btnCreateUser.post(new Runnable() {
@Override
public void run() {
btnCreateUser .performClick();
}
});
}
}, 0, 14400); // for 4 hours
答案 1 :(得分:1)
使用AlarmManager
(http://developer.android.com/reference/android/app/AlarmManager.html)以后重复开始您的活动。
假设您用于收集用户数据并将其发送到服务器的活动称为YourActivity
,只需添加一些静态方法,以便安排活动开始。
您可以在申请开始时或schedule
BOOT_COMPLETE
调用BroadcastReceiver
方法。
public static void schedule(Context context, String url,
long triggerAtMillis, long intervalMillis) {
final AlarmManager alarmManager =
(AlarmManager) context.getSystemService(ALARM_SERVICE);
alarmManager.setRepeating(AlarmManager.RTC, triggerAtMillis,
intervalMillis, createPendingOperation(context));
}
public static void unschedule(Context context) {
final AlarmManager alarmManager =
(AlarmManager) context.getSystemService(ALARM_SERVICE);
alarmManager.cancel(createPendingOperation(context));
}
private static PendingIntent createPendingOperation(Context context) {
return PendingIntent.getActivity(
context, 0, new Intent(context, YourActivity.class),
PendingIntent.FLAG_CANCEL_CURRENT);
}