0

私は Facebook Graph API を使用して Facebook プロファイルのリストを要求し、名前とプロファイル写真の両方を表示する ListView でそれらを返します。メイン アクティビティには、ファーストネームとセカンドネームの両方を入力するための 2 つの EditText フィールドがあります。ボタンをクリックすると ListViewActivity が開始され、名前が渡されます。ListView が膨張し、リクエストが Facebook に送信され、ListView の各行がカスタム アダプターを使用して更新されます。

問題は、メモリリークだと思います。運が良ければ1回か2回動作し、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;

これらの 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 に答える