我正在开发一种Android服务,尝试每x次获取设备IP地址并将其发送到服务器。 我正在使用:
Netbeans 7.2
Android SDK
Android Google-Api 8
SQLite
我知道有一些与此问题有关的问题,但没有一个问题能解决我的问题。正如您在下面的代码中看到的那样,我并没有尝试访问服务主线程的UI(好吧,我试过,但在我评论该行后,错误仍然相同)。另一方面,我正在使用 AsyncTask ,我认为这是适当的方法。
这是我服务的主要部分:
public class ArsosService extends Service {
private NotificationManager mNM;
private final Messenger mMessenger = new Messenger(new IncomingHandler());
protected DatabaseUtil dbu = null;
@Override
public void onCreate() {
mNM = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
try {
dbu = DatabaseUtility.getInstance(this);
} catch (IOException ex) {
Log.e("Service", ex);
}
Timer timer = new Timer();
timer.schedule(new Checks(), 0, 15000);
}
private class Checks extends TimerTask {
@Override
public void run() {
CheckIpAddress_Task checkIp = new CheckIpAddress_Task();
checkIp.execute();
}
}
// Other methods
private class CheckIpAddress_Task extends AsyncTask<Void, Void, Integer> {
@Override
protected Integer doInBackground(Void... arg0) {
String ipLocal = getLocalIpAddress();
String text = null;
// ipLocal==null means there is no available connection, so we do nothing.
if (ipLocal != null) {
String ipDb = dbu.getLastIP(); // we get the IP saved in the DB.
if (ipDb == null) {
dbu.addProperty("IP", ipLocal); // we save the IP in the DB.
} else if (!ipLocal.equals(ipDb)) {
dbu.setProperty("IP", ipLocal); // we update the IP in the DB.
}
}
if (text != null) {
//showNotification(1, text, ipLocal);
}
return 0;
}
private String getLocalIpAddress() {
String result = null;
// Irrelevant code
return result;
}
}
}
我认为问题可能与线程有关,但我看不到哪里。任何帮助将不胜感激。
编辑:虽然我已经接受了其中一个答案是正确的,或者也许是因为它,我一直在寻找更多关于它的信息。我遇到了this page我希望与所有有一天需要了解这个问题的人分享。它的作者Tejas Lagvankar以非常清晰易懂的方式解释了关于线程,弯针和处理程序的所有内容。
答案 0 :(得分:1)
试试这个......
- 首先在类范围中声明Handler
对象引用变量。
Handler h;
- 在onCreate()
方法内创建处理程序的实例。
h = new Handler();
- 将其与以下主题一起使用:
new Thread(new Runnable(){
public void run(){
h.post(new Runnable(){
// Do the UI work here.
});
}
});
- 您可以很好地使用android中提供的AsyncTask
,它称为P * 无线线程。 *
答案 1 :(得分:1)
处理程序始终在Looper线程上下文中运行。声明一个单独的线程时,它的上下文与Looper不同。因此错误。
简单的解决方案总是在onCreate(),onStart()和onResume()中声明处理程序。如果你使用AsyncTasks,你可以在onPreExecute()和onPostExecute()中声明处理程序,因为它们也在Looper上下文中运行。