无法在线程内创建处理程序。 我如何使用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上下文中运行。
- android添加java.lang.management API
- android loadIcon生成outOfMemoryError
- 单击时更改TextView的背景颜色
- Android – Sqlite数据库方法undefined fot类型
- Android – SQLite + SharedPreferences,2个线程同时读/写?
- 错误:0D0680A8:asn1编码例程:ASN1_CHECK_TLEN:导入RSA公钥时出错标记
- 选择状态后,使用notifyDataSetChanged更新City Spinner
- 在VIewPager(Android)中的两个片段之间传递数据(NullPointerException)
- 如何在android中选择和取消选择图像?