gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 07:31:38 25 4
gpt4 key购买 nike

Possible Duplicate:
Can’t create handler inside thread that has not called Looper.prepare() inside AsyncTask for ProgressDialog

我正在开发一个 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 以非常清晰易懂的方式解释了有关线程、循环器和处理程序的所有内容。

最佳答案

试试这个...

-首先在类范围声明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*无线程。*

关于java - 无法在线程内创建处理程序。如何使用 Looper.prepare()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12837196/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com