-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 的引用,否则可能会导致内存泄漏。

理想情况下,您应该创建一个可以将数据返回到您的活动的观察者。

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() 即可。否则你的 Activity 会泄漏。

于 2012-06-26T22:36:25.547 回答