I'd like to send http requests every N seconds. The response should be shown is some textViews. I've used timer. I guess a simple loop is not a good way.
I got error that "Can't create handler inside thread that has not called Looper.prepare()"
My test Async requests in main activity (not in timer thread) work okay, and I can see responses in textView.
My code is below:
private void runTimer() {
MyTimerTask myTask = new MyTimerTask();
Timer myTimer = new Timer();
myTimer.schedule(myTask, 3000, 1500);
}
class MyTimerTask extends TimerTask {
public void run() {
asyncGetRequest();
}
}
private void asyncGetRequest(){
new DownloadWebPageTask().execute("http://www.google.com");
}
....
//this method is called automatically after receiving http response
@Override
protected void onPostExecute(String result) {
someTextView.setText("some text");
}
Thanks!!!
@@@@@@@@@@@@@@@@@@@@@@@@@@@ UPDATED!!! Now it works!!!! @@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@ UPDATED!!! Now it works!!!! @@@@@@@@@@@@@@@@@@@@@@@@@@@
I tried different examples of AlarmManagers. They don't work. But this one works (answer number 4 there) Alarm Manager Example
My code to get HTTP responses periodically is below. It works! But it works only once. (even if I comment the line with
context.unregisterReceiver( this )
So I run "runAlarm()" after getting HTTP response. So it is recursive performance. Will I have stack overflow at least? Any comments, please? Thanks!
public void SetAlarm()
{
BroadcastReceiver receiver = new BroadcastReceiver() {
@Override public void onReceive( Context context, Intent _ )
{
asyncGetRequest();
Toast.makeText(context, "Alarm !!!!!!!!!!", Toast.LENGTH_LONG).show();
context.unregisterReceiver( this ); // this == BroadcastReceiver, not Activity
}
};
this.registerReceiver( receiver, new IntentFilter("com.blah.blah.somemessage") );
PendingIntent pintent = PendingIntent.getBroadcast( this, 0, new Intent("com.blah.blah.somemessage"), 0 );
AlarmManager manager = (AlarmManager)(this.getSystemService( Context.ALARM_SERVICE ));
// set alarm to fire 5 sec (1000*5) from now (SystemClock.elapsedRealtime())
manager.set( AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + 1000*5, pintent );
}
private void runAlarm() {
SetAlarm();
}
@Override
protected void onPostExecute(String result) {
showMyHttpResponseSomewhere();
runAlarm();
}
And how should I replace this bla-bla-bla? Not understood the purpose of this line
this.registerReceiver( receiver, new IntentFilter("com.blah.blah.somemessage") );