重複の可能性:
ProgressDialog の AsyncTask 内で Looper.prepare() を呼び出していないスレッド内でハンドラーを作成できない
x回ごとにデバイスのIPアドレスを取得してサーバーに通信しようとするAndroidサービスを開発しています。私は使用しています:
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;
}
}
}
問題はスレッドに関連している可能性があると思いますが、どこにあるのかわかりません。どんな助けでも大歓迎です。
EDITED:私は答えの1つを正しいものとして受け入れましたが、それが原因である可能性がありますが、それに関する詳細情報を探しています. いつかこの問題についてもっと知る必要がある皆さんと共有したいこのページに出くわしました。その作者である Tejas Lagvankar は、スレッド、ルーパー、およびハンドラーに関するすべてを非常に明確でわかりやすい方法で説明しています。