[英]Http Request in Android from the service
我正在尝试从服务而不是从活动中执行发布Http请求。 已经将该服务设置为在timertask的帮助下5秒后连续调用。
在此服务中,我正在发送引发错误android.os.NetworkOnMainThreadException
http请求,我知道为什么从我的主线程发送违反android规则的http请求时会引发此错误。
另外,我知道我可以使用AsyncTask类,但是问题是AsyncTask类需要具有UI线程,而我在使用该线程时没有。
我可能遇到的另一个约束是,父类每5秒使用一次此类,因此可能存在线程问题。 不确定。
因此,有人可以建议我执行该任务的方法吗,我不确定是否可以使用处理程序,如果可以,请给我简单的示例,因为我与android有点脱节。
如果您需要我的代码片段,请告诉我,但这很简单,只是使用httpclient的json HTTP请求。
public abstract class Data extends TimerTask {
protected void request(JSONObject content) {
Log.i(TAG, content.toString());
try {
HttpClient client = new DefaultHttpClient();
HttpPost httpost = new HttpPost("http://test.test.test/data.json");
StringEntity se = new StringEntity(measurement.toString());
httpost.setEntity(se);
httpost.setHeader("Accept", "application/json");
httpost.setHeader("Content-type", "application/json");
ResponseHandler responseHandler = new BasicResponseHandler();
client.execute(httpost, responseHandler);
}catch(IOException exception){
exception.printStackTrace();
}
}
}
这是一个来自android docs的创建后台服务的简单示例。完成您所描述内容的最简单方法是,从后台线程获取一个简单的HttpPost
而不使用AsyncTask
即使用IntentService
。
public class BackgroundService extends IntentService {
@Override
protected void onHandleIntent(Intent workIntent) {
Bundle extras = workIntent.getExtras();
if(extras != null){
//do work here
}
}
}
基本思想很简单。 在mainfest中重新使用服务后,就可以使用Intent
来启动它并向它发送所需的任何数据。
Intent startIntent = new Intent(this, BackgroundService.class);
startService.putExtra(stringMeasurmentToPost);
startService(startIntent);
这会将数据广播到您的IntentService
,启动它,并在后台线程上执行所需的任何操作。 如果您真的要每5秒左右执行一次此操作,则可以考虑使用常规服务而不是意图服务。 这两个类之间的主要区别在于, IntentService
在完成您要执行的操作时将停止,而Service
可以在后台保持活动状态,只要它不会被正常的系统进程杀死即可。 您仍然可以发送任务的一个Service
使用意图,但一个的建立Service
比一的slightliy更复杂IntentService
。
另外-我不会使用TimerTask
。 相反,如果您需要在循环上重复执行操作,则可以将Handler
和Runnable
与postDelayed()结合使用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.