【问题标题】:Http Request in Android from the service来自服务的 Android 中的 Http 请求
【发布时间】:2014-02-11 20:20:07
【问题描述】:

我正在尝试从服务而不是来自活动的发布 Http 请求。在 timertask 的帮助下,该服务已设置为 5 秒后连续调用。

在此服务中,我正在发送抛出错误android.os.NetworkOnMainThreadException 的http 请求,我知道为什么在我从主线程发送违反android 规则的http 请求时会抛出此错误。

此外,我知道我可以使用 AsyncTask 类,但问题是 AsyncTask 类需要有 UI 线程,而我在服务中没有。

可能是我遇到的另一个限制是父类每 5 秒使用一次调用这个类,所以可能是一些线程问题。不确定。

那么,任何人都可以建议我执行此任务的一些想法,我不确定我是否可以使用处理程序,如果可以,请给我一个简单的例子,因为我与 android 有点脱节。

如果您需要我的代码 sn-p 告诉我,但它非常直接,只是使用 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();
    }
}

}

【问题讨论】:

  • 由于TimerTask 是在后台线程上执行的,因此您的代码有问题。请发布代码和完整的堆栈跟踪。
  • 这是更新的
  • 首先,Data 是一个抽象类,这意味着这里至少还有一个您没有的其他类,因为您无法创建Data 的实例。其次,您没有发布堆栈跟踪。
  • 是的,但我想更多的 imp 是如何从这里发出 http 请求 ....

标签: android multithreading android-asynctask android-service httprequest


【解决方案1】:

这是creating a background service 上的android 文档中的一个简单示例。完成您所描述的最简单的方法是使用IntentService 来自后台线程的简单HttpPost,而不使用AsyncTask

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 的设置比IntentService 的设置稍微复杂一些。

另外 - 我不会使用 TimerTask。相反,如果您需要在循环中重复执行操作,我会使用 HandlerRunnable 与 postDelayed() 组合。

【讨论】:

  • 我正在研究这个 IntentService,但不适合我的情况,但我知道我是否可以使用工作处理程序?你说什么
  • 您可以知道是否可以使其与处理程序一起使用?如果这是您的要求,您当然可以使用处理程序/可运行组合而不是 TimerTask。如果IntentService 不起作用,那么正常服务甚至AsyncTask 怎么办?这些不起作用有什么具体原因吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-19
相关资源
最近更新 更多