我想每隔N秒发送一次http请求。 应该显示的响应是一些textViews。 我用过计时器。我想一个简单的循环不是一个好方法。
我收到了错误 “无法在线程内创建处理程序 没有调用Looper.prepare()“
我的测试主要活动中的异步请求(不在计时器线程中)工作正常, 我可以在textView中看到响应。
我的代码如下:
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");
}
感谢!!!
@@@@@@@@@@@@@@@@@@@@@@@@@@@ 更新!!!现在它有效!!!! @@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@ 更新!!!现在它有效!!!! @@@@@@@@@@@@@@@@@@@@@@@@@@@
我尝试了不同的AlarmManagers示例。 它们不起作用。 但是这个有效(在那里回答4号) Alarm Manager Example
我的代码定期获取HTTP响应如下。 有用! 但它只工作一次。 (即使我用
评论该行context.unregisterReceiver( this )
所以我在获得HTTP响应后运行“runAlarm()”。 所以它是递归性能。 我至少会有堆栈溢出吗? 有什么意见吗? 谢谢!
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();
}
我应该如何更换bla-bla-bla? 不明白这条线的目的
this.registerReceiver( receiver, new IntentFilter("com.blah.blah.somemessage") );
答案 0 :(得分:0)
您无法在主UI线程中执行网络请求。请尝试使用 AsyncTask 。
根据您的更新提问:
private final static int INTERVAL = 1000 * 60 * 1; //interval is 1 minute to repeat
Handler mHandler;
Runnable mHandlerTask = new Runnable()
{
@Override
public void run() {
//call your asynctask i.e. asyncTask.execute();
mHandler.postDelayed(mHandlerTask, INTERVAL);
}
};
使用以下内容将其停止
void stopRepeatingTask()
{
mHandler.removeCallbacks(mHandlerTask);
}
使用以下内容重新启动
void startRepeatingTask()
{
mHandlerTask.run();
}
答案 1 :(得分:0)
我不知道这是否已解决,但Activity.runOnUiThread
可能适合您。我无法弄清楚是否正确链接,但这是文档的链接。 : - )