无法创建内螺纹处理程序。 如何使用Looper.prepare()? [重复](Can'

2019-09-23 23:20发布

可能重复:
不能内螺纹已不叫Looper.prepare()里面的AsyncTask的ProgressDialog创建处理程序

我开发一个Android的服务,尝试获取设备的IP地址每x时间,它comunicate到服务器。 我正在使用:

Netbeans的7.2
Android SDK中
谷歌Android的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;
        }
    }
}

我认为这个问题可能与线程,但我看不到的地方。 任何帮助将不胜感激。

编辑:虽然我已接受的答案是正确的,也许是因为它的一个,我一直在寻找一些更多的信息关于它。 我碰到这个网页我想和大家谁哪天需要更多地了解这个问题分享。 它的作者,Tejas的Lagvankar,解释了有关线程,尺蠖和处理程序非常清晰和易于理解的方式应有尽有。

Answer 1:

尝试这个...

-首先声明的Handler类范围对象引用变量。

Handler h;

-里面onCreate()方法创建的处理程序的实例

h = new Handler();

-用类似下面的线程使用它:

new Thread(new Runnable(){

 public void run(){

    h.post(new Runnable(){


      // Do the UI work here.

   });

 }


});

-你可以很好的使用AsyncTask ,在android系统提供,其作为P * ainless线程已知的 *



Answer 2:

处理器始终在弯针线的上下文。 当你声明一个单独的线程,它的背景是从弯不同。 因此,错误。

简单的方法是始终的onCreate(),在onStart()和申报的onResume处理程序()。 如果你使用AsyncTasks,可以很好地申报onPreExecute()和onPostExecute()处理程序,因为他们太活套上下文中运行。



文章来源: Can't create handler inside thread. How do I use Looper.prepare()? [duplicate]