可能重複:
Can’t create handler inside thread that has not called Looper.prepare() inside AsyncTask for ProgressDialog無法在線程內部創建處理程序。我如何使用Looper.prepare()?
我開發一個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;
}
}
}
我認爲這個問題可能與線程,但我看不到的地方。任何幫助將不勝感激。
編輯:儘管我接受了其中一個正確的答案,或許正因爲此,我一直在尋找更多關於它的信息。我遇到了this page我想與大家分享一些需要了解此問題的人。它的作者Tejas Lagvankar以一種非常明確和可理解的方式解釋了關於線程,操作符和處理程序的所有信息。
首先,我很抱歉沒有回答過。感謝您的時間和答案。我遵循你的指示,而且效果很好。但是,我不太確定這是否是一種非常正統的方式。我的方法現在看起來是這樣的: 私有類檢查擴展的TimerTask { @覆蓋 公共無效的run(){ h.post(新的Runnable(){ 公共無效的run(){ CheckIpAddress_Task checkIp =新CheckIpAddress_Task() ; checkIp.execute(); } }); } } 正如我所說,這個字,但它是正確的嗎? – Julio