-1

別のスレッドから更新したいマップがあります。asynctask を拡張するクラスから UI を更新しようとすると、いくつかの問題が発生します。そして、コードをメインスレッドのハンドラーに移動すると、NetworkOnMainThreadException. 以下は私の非同期タスクです。それを機能させるために変更する方法はありますか?

@Override
    protected Integer doInBackground(Void... params) {

        try {

            HttpClient httpclient = new DefaultHttpClient();
            HttpPost httppost = new HttpPost("http://83.xx.xx:8080/android/service.php");

            List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
            nameValuePairs.add(new BasicNameValuePair("action", "getusers"));
            nameValuePairs.add(new BasicNameValuePair("interval", Integer.toString(interval)));

            httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

            HttpResponse response = httpclient.execute(httppost);

            String jsonString = EntityUtils.toString(response.getEntity());

            Gson gson = new GsonBuilder().create();

            Type listType = new TypeToken<ArrayList<User>>() {}.getType();
            ArrayList<User> userList = gson.fromJson(jsonString, listType);

            ((GoogleMapsActivity) activity).removeOverlayItems();

            for(User user : userList ){

                ((GoogleMapsActivity) activity).addOverlayItem(Double.parseDouble(user.last_lat), Double.parseDouble(user.last_lng), user.bluetooth_name, "test desc");
            }


            return 1;

        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
4

1 に答える 1

1

doInBackground で地図に触れるのではなく、データを onPostExecute に返します。次に、onPostExecute からマップを更新します。

AsyncTask 内から Activity への参照を保持しないでください。そうしないと、メモリ リークが発生する可能性があることに注意してください。

理想的には、Activity にデータを返すことができるオブザーバーを作成する必要があります。

interface Observer {
    public void onMyDataAvailable(MyDataClass data);
}

次に、このオブザーバーへの参照を使用して AsyncTask をインスタンス化します。

class MyAsyncTask extends AsyncTask ...
    private Observer observer;

    public MyAsyncTask(Observer observer) {
        mObserver = observer;
    }

    public synchronized void onActivityDestroyed() {
        mObserver = null;
    }

    public synchronized void onPostExecute(MyDataClass result) {
        if (mObserver != null) {
            mObserver.onMyDataAvailable(result);
        }
    }

アクティビティの onDestroy メソッドから onActivityDestroyed() を呼び出すようにしてください。そうしないと、アクティビティがリークします。

于 2012-06-26T22:36:25.547 に答える