繁体   English   中英

Android中来自服务的Http Request

[英]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 相反,如果您需要在循环上重复执行操作,则可以将HandlerRunnable与postDelayed()结合使用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM