无法在线程内创建处理程序。 我如何使用Looper.prepare()?

可能重复:
无法在未在AsyncTask for ProgressDialog中调用Looper.prepare()的线程内创建处理程序

我正在开发一种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 { @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; } } } 

我认为问题可能与线程有关,但我看不到哪里。 任何帮助将不胜感激。

编辑:虽然我已经接受了其中一个答案是正确的,或者也许是因为它,我一直在寻找更多关于它的信息。 我已经遇到了这个页面,我想与所有有一天需要了解这个问题的人分享。 它的作者Tejas Lagvankar以一种非常清晰易懂的方式解释了有关线程,弯针和处理程序的所有内容。

尝试这个…

首先在类范围声明Handler Object引用变量。

Handler h;

onCreate()方法内部创建Handler实例

h = new Handler();

使用下面的线程:

 new Thread(new Runnable(){ public void run(){ h.post(new Runnable(){ // Do the UI work here. }); } }); 

你可以很好地使用android中提供的AsyncTask ,它被称为P * ainless线程。 *

Handler始终在Looper线程上下文中运行。 声明一个单独的线程时,它的上下文与Looper不同。 因此错误。

简单的解决方案始终在onCreate(),onStart()和onResume()中声明处理程序。 如果使用AsyncTasks,则可以在onPreExecute()和onPostExecute()中声明处理程序,因为它们也在Looper上下文中运行。