从内部类修改另一个类中的arraylist?

时间:2014-12-24 23:24:03

标签: java android

我有一个android项目......我必须修改一个arraylist,它是在一个内部类的外部类中定义的。我在外部类中创建了一个setter方法,以便我可以从内部类访问它并修改它。但是在执行代码之后,我总是在外部类中将arraylist的大小设置为零。在内部类中修改时,arraylist的大小不为零。

这是我的代码:

public class MapActivity extends Activity implements LocationListener, GooglePlayServicesClient.ConnectionCallbacks,
        GooglePlayServicesClient.OnConnectionFailedListener {


    public ArrayList<SimpleGeofence> mygeo = new ArrayList<SimpleGeofence>();


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_map);

        setupMap();
    }
    public void setList(ArrayList<SimpleGeofence> list) {
        this.mygeo = list;
    }
    private void setupMap() {   
        Log.i("size of array", mygeo.size()+"");

    }   

    public static class AsyncTaskParseJson extends AsyncTask<String, String, String> {

        public static ArrayList<SimpleGeofence> mygeotemp = new ArrayList<SimpleGeofence>();        

        @Override
        public void onPreExecute() {}

        @Override
        public String doInBackground(String... arg0) {

            try {
                    //update mygeotemp ArrayList


            } catch (JSONException e) {
                e.printStackTrace();
            }
            return null;
        }
        @Override
        public void onPostExecute(String strFromDoInBg) {
            MapActivity mappa = new MapACtivity();
            mappa.setList(mygeotemp);

        }
    }

有人能找到我的错吗?或者也许告诉我一个更好的方法来获得外部类中修改过的arraylist?

1 个答案:

答案 0 :(得分:1)

您的AsyncTaskParseJson未绑定到MapActivity的实例,因为它是static。您在获得结果时创建new MapACtivity()并向其提供列表,但这不会影响原始活动。

线程安全方法可能如下所示:

class MapActivity {
    private volatile ArrayList<SimpleGeofence> mygeo = new ArrayList<SimpleGeofence>();

    /* other methods */

    public void setList(ArrayList<SimpleGeofence> list) {
        this.mygeo = list;
    }

    class AsyncTaskParseJson extends AsyncTask<String, String, String> {
        /* other methods */
        @Override
        public void onPostExecute(String strFromDoInBg) {
            // Do *not* create a new instance of the activity here
            setList(mygeotemp);
        }
    }
}