0

重複の可能性:
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 は、スレッド、ルーパー、およびハンドラーに関するすべてを非常に明確でわかりやすい方法で説明しています。

4

2 に答える 2

1

これを試して...

-まず、Handlerオブジェクト参照変数をクラス スコープで宣言します。

Handler h;

-メソッド内で HandleronCreate()のインスタンスを作成します。

h = new Handler();

-以下のようなスレッドで使用します。

new Thread(new Runnable(){

 public void run(){

    h.post(new Runnable(){


      // Do the UI work here.

   });

 }


});

- Android で提供されている、P* ainless スレッドAsyncTaskとして知られているを非常によく使用できます。*

于 2012-10-11T10:17:10.700 に答える
1

Handler は常に Looper スレッド コンテキストで実行されます。別のスレッドを宣言すると、そのコンテキストはルーパーとは異なります。したがって、エラー。

簡単な解決策は、常に onCreate()、onStart()、および onResume() でハンドラを宣言することです。AsyncTasks を使用する場合、onPreExecute() および onPostExecute() でハンドラーを適切に宣言できます。これは、これらも Looper コンテキストで実行されるためです。

于 2012-10-11T10:27:16.937 に答える