Android警报在单独进程中未触发
下面的代码来自我的MANIFEST.XML文件 下面的工作原理:Android警报在单独进程中未触发,android,multithreading,alarm,Android,Multithreading,Alarm,下面的代码来自我的MANIFEST.XML文件 下面的工作原理: 我有一个转折点: public void onReceive(上下文、意图) 如果没有远程进程,它会工作;如果我添加远程进程,它会停止工作 我错过了什么 好的,让我发布我的异步HTTPGET package com.PageP; import java.io.IOException; import org.apache.http.client.ClientProtocolException; import org.apache
我有一个转折点:
public void onReceive(上下文、意图)
如果没有远程进程,它会工作;如果我添加远程进程,它会停止工作
我错过了什么
好的,让我发布我的异步HTTPGET
package com.PageP;
import java.io.IOException;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.ResponseHandler;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.BasicResponseHandler;
import org.apache.http.impl.client.DefaultHttpClient;
import android.os.AsyncTask;
public class GrabURL extends AsyncTask<String, Void, Void> {
private HttpClient Client = new DefaultHttpClient();
private String content;
private String Error = null;
private String url = null;
protected void onPreExecute() {
// Dialog.setMessage("Downloading source..");
// Dialog.show();
}
protected Void doInBackground(String... urls) {
url = urls[0];
try {
HttpGet httpget = new HttpGet(urls[0]);
ResponseHandler<String> responseHandler = new BasicResponseHandler();
content = Client.execute(httpget, responseHandler);
} catch (ClientProtocolException e) {
Error = e.getMessage();
cancel(true);
} catch (IOException e) {
Error = e.getMessage();
cancel(true);
}
return null;
}
protected void onPostExecute(Void unused) {
Login.GotURL(content, url);
Client = null;
}
}
当我的警报触发时,我希望它也保持清醒,以便在我解码返回HTML的另一端接收数据。我遇到的问题是,当ANDROID进入睡眠模式时,它无法可靠地接收HTML返回的数据
我错过了什么
因为有一个单独的进程通常是个坏主意,所以只需关闭android:process
我需要它保持清醒足够长的时间来调用异步wget并处理返回的html
我不知道你认为什么是“异步”。我将假设你的字面意思是,你正在用你的应用程序打包一个ARM编译的wget
二进制文件,这是不可思议的
此外,Android将在几秒钟内终止您的进程,因为它占用了该进程的主应用程序线程。因此,您将浪费RAM、CPU和电池,而没有任何特殊优势
使用HttpUrlConnection
或HttpClient
从WakefulIntentService
或您自己的IntentService
执行HTTP请求(“异步wget”),该服务处理与使用\u WAKEUP
警报有关的WakeLock
问题IntentService
为您提供了一个后台线程(执行长时间运行的工作所必需的),并在不再需要时自动关闭(必需的,这样用户就不会因为任务杀手伤害他们的设备而攻击您)
我可以进入一个do/循环,并在其中睡觉,每隔250毫秒醒来一次,看看数据是否已经输入
如果您使用HttpUrlConnection
或HttpClient
执行HTTP请求,您将通过这些API知道“数据是否已进入”
有固定的时间
如果您使用HttpUrlConnection
或HttpClient
来执行HTTP请求,您将能够指定请求超时时间。由于使用单独的进程通常不是一个好主意,只需关闭android:process
。好吧,我的情况如下。我有一个警报,每10分钟触发一次。我需要它保持清醒足够长的时间来调用异步wget并处理返回的html。我想,如果我在一个单独的过程中使用闹钟,我可以进入do/循环,并在其中睡眠,每250毫秒醒来一次,查看数据是否在设定的超时时间内进入,如果在超时时间内,并且一旦收到数据,我就可以释放唤醒锁。然后退出循环。其他想法?我已经添加了更多的代码来向您展示我已经准备好的东西。不,我实际上没有使用WGET。您可以在新发布的代码中看到我正在做什么来调用html。谢谢你的帮助…@user225068:我的答案仍然有效。使用IntentService
(使用您自己的WakeLock
)或myWakefulIntentService
来执行HTTP请求,而不是AsyncTask
。如果我执行的是非异步请求,程序是否会出现赫基抖动?或者http请求是异步完成的?@user225068:“如果我正在执行非异步请求,程序会不会异常?”——正如我所写的,“IntentService
为您提供了一个后台线程(执行长时间运行的工作所必需的)”。因此,从主应用程序线程的角度来看,您正在执行“异步请求”。
public static void Ping(String Args) {
final GrabURL wget = new GrabURL();
String url = "";
url = MyAuth("PING")+ Args;
wget.execute(PPURL+url);
}