0

我正在使用 Facebook Graph API 来请求 Facebook 个人资料列表并将它们返回到 ListView 中,同时显示名称和个人资料图片。我的主要活动中有两个 EditText 字段来输入名字和名字。单击按钮并传递名称时,按钮将启动我的 ListViewActivity。ListView 膨胀,请求被发送到 Facebook,ListView 中的每一行都使用自定义适配器进行更新。

我怀疑问题是内存泄漏。它非常喜怒无常,如果我很幸运,它会工作一两次,并且任何其他更新 ListView 的尝试都不起作用,活动将保持空白。它也不适用于一些更常见的名称。

下面是我的 ListViewActivity:

public class ListViewActivity extends Activity implements OnItemClickListener {

public String firstname, secondname;
URL imageURL;
ArrayList<String> names = new ArrayList<String>();
ArrayList<Bitmap> bitmaps = new ArrayList<Bitmap>();

public static final String[] descriptions = new String[] {"Description"};

ListView listView;
List<RowItem> rowItems;

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

    loadData();
    rowItems = new ArrayList<RowItem>();

    listView = (ListView) findViewById(R.id.listview);
    CustomListViewAdapter adapter = new CustomListViewAdapter(this,
            R.layout.list_item, rowItems);
    listView.setAdapter(adapter);
    listView.setOnItemClickListener(this);
}

public void loadData() {
    Session session = Session.getActiveSession();

    firstname = getIntent().getExtras().getString("firstname");
    secondname = getIntent().getExtras().getString("secondname");

    if(session==null){                      
        session = Session.openActiveSessionFromCache(this);
    } else if (session.isOpened()) {

        Bundle params = new Bundle();
        params.putString("fields", "name, picture, url, id");
        params.putString("limit", "10");

        Request request = new Request(session, "search?q="+ firstname + "%20" + secondname + "&limit=10&type=user&fields=name,picture", params, HttpMethod.GET, new Request.Callback() {

            @Override
            public void onCompleted(Response response) {
                // TODO Auto-generated method stub 
                JSONObject jsonObject = null;
                JSONArray jArray = null;
                imageURL = null;

                try {
                    jsonObject = new JSONObject(response.getGraphObject().getInnerJSONObject().toString());
                    jArray = jsonObject.getJSONArray("data");

                    for (int i = 0; i < jArray.length(); i++) {
                        JSONObject element = null;
                        element = jArray.getJSONObject(i);

                        imageURL = new URL("http://graph.facebook.com/"+ element.get("id") +"/picture?type=large");
                        names.add(element.getString("name").toString());
                        Thread thread = new Thread(new Runnable() {

                            @Override
                            public void run() {
                                // TODO Auto-generated method stub
                                try {
                                    bitmaps.add(BitmapFactory.decodeStream(imageURL.openConnection().getInputStream()));
                                } catch (IOException e) {
                                    // TODO Auto-generated catch block 
                                    e.printStackTrace();
                                }
                            }
                        });
                        thread.start();
                        thread.join();
                        if (bitmaps.size() == jArray.length()) {
                            for (int j=0; j<jArray.length(); j++) {
                                RowItem item = new RowItem(bitmaps.get(j), names.get(j), descriptions[0]);
                                rowItems.add(item);
                            }
                        }
                    }
                } catch (JSONException e) {

                    System.out.println("JSON EXCEPTION:"+ e);
                } catch (MalformedURLException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        });
        RequestAsyncTask task = new RequestAsyncTask(request);
        task.execute();
    } else {
        Log.d("close", " "); 
    } 
}

@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
        long id) {
    Toast toast = Toast.makeText(getApplicationContext(),
            "Item " + (position + 1) + ": " + rowItems.get(position),
            Toast.LENGTH_SHORT);
    toast.setGravity(Gravity.BOTTOM|Gravity.CENTER_HORIZONTAL, 0, 0);
    toast.show();
}

}

如果有人可以帮助发现内存泄漏(如果这确实是问题,因为我得到了 7-10% 的空闲空间)并建议是否有更好的方法来实现这一点,我将不胜感激?谢谢

编辑:只是为了澄清我正在通过返回主要活动在编辑文本字段中输入新名称并单击按钮以再次启动列表视图来更新列表

4

1 回答 1

0

缩放图像有帮助吗?

BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 2;

我在第 67 行添加了这两行

public class ListViewActivity extends Activity implements OnItemClickListener {

public String firstname, secondname;
URL imageURL;
ArrayList<String> names = new ArrayList<String>();
ArrayList<Bitmap> bitmaps = new ArrayList<Bitmap>();

public static final String[] descriptions = new String[] {"Description"};

ListView listView;
List<RowItem> rowItems;

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

    loadData();
    rowItems = new ArrayList<RowItem>();

    listView = (ListView) findViewById(R.id.listview);
    CustomListViewAdapter adapter = new CustomListViewAdapter(this,
            R.layout.list_item, rowItems);
    listView.setAdapter(adapter);
    listView.setOnItemClickListener(this);
}

public void loadData() {
    Session session = Session.getActiveSession();

    firstname = getIntent().getExtras().getString("firstname");
    secondname = getIntent().getExtras().getString("secondname");

    if(session==null){                      
        session = Session.openActiveSessionFromCache(this);
    } else if (session.isOpened()) {

        Bundle params = new Bundle();
        params.putString("fields", "name, picture, url, id");
        params.putString("limit", "10");

        Request request = new Request(session, "search?q="+ firstname + "%20" + secondname + "&limit=10&type=user&fields=name,picture", params, HttpMethod.GET, new Request.Callback() {

            @Override
            public void onCompleted(Response response) {
                // TODO Auto-generated method stub 
                JSONObject jsonObject = null;
                JSONArray jArray = null;
                imageURL = null;

                try {
                    jsonObject = new JSONObject(response.getGraphObject().getInnerJSONObject().toString());
                    jArray = jsonObject.getJSONArray("data");

                    for (int i = 0; i < jArray.length(); i++) {
                        JSONObject element = null;
                        element = jArray.getJSONObject(i);

                        imageURL = new URL("http://graph.facebook.com/"+ element.get("id") +"/picture?type=large");
                        names.add(element.getString("name").toString());
                        Thread thread = new Thread(new Runnable() {

                            @Override
                            public void run() {
                                // TODO Auto-generated method stub
                                try {
                                    BitmapFactory.Options options = new BitmapFactory.Options();
                                    options.inSampleSize = 2;
                                    bitmaps.add(BitmapFactory.decodeStream(imageURL.openConnection().getInputStream()));
                                } catch (IOException e) {
                                    // TODO Auto-generated catch block 
                                    e.printStackTrace();
                                }
                            }
                        });
                        thread.start();
                        thread.join();
                        if (bitmaps.size() == jArray.length()) {
                            for (int j=0; j<jArray.length(); j++) {
                                RowItem item = new RowItem(bitmaps.get(j), names.get(j), descriptions[0]);
                                rowItems.add(item);
                            }
                        }
                    }
                } catch (JSONException e) {

                    System.out.println("JSON EXCEPTION:"+ e);
                } catch (MalformedURLException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        });
        RequestAsyncTask task = new RequestAsyncTask(request);
        task.execute();
    } else {
        Log.d("close", " "); 
    } 
}

@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
        long id) {
    Toast toast = Toast.makeText(getApplicationContext(),
            "Item " + (position + 1) + ": " + rowItems.get(position),
            Toast.LENGTH_SHORT);
    toast.setGravity(Gravity.BOTTOM|Gravity.CENTER_HORIZONTAL, 0, 0);
    toast.show();
}
}
于 2013-09-12T09:44:05.427 回答