在计时器线程中生成异步http请求的错误

时间:2014-08-10 06:57:47

标签: android multithreading timer handler textview

我想每隔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") );

2 个答案:

答案 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可能适合您。我无法弄清楚是否正确链接,但这是文档的链接。 : - )

enter link description here