1

このコードを使用すると、OutOfMemory例外が発生します。

     class ApiTask extends AsyncTask<URI, Void, String> {

    private Exception exception;

    protected void onPreExecute() {
        dialog = ProgressDialog.show(DownloadedActivity.this, "", 
                "Contacting Server...", true);
    }

    protected String doInBackground(URI... uri) {
        try {

            HttpClient client = new DefaultHttpClient();
            HttpGet request = new HttpGet();
            try {
                request.setURI(uri[0]);
                return client.execute(request, new BasicResponseHandler());
            } catch (Exception e) {
                e.printStackTrace();
            }

            return "Error";

        } catch (Exception e) {
            this.exception = e;
            return "Error";
        }
    }

    @Override
    protected void onPostExecute(String result) {
        dialog.dismiss();
        processJSON(result);
        updateListView();
        result = null;
        System.gc();
           }
          }

このコードをrefreshメソッドで2回実行するとエラーが発生します。これにより、メモリリークが疑われます。応答は大きなJSONオブジェクトです。私は私が間違っていることを知りたいと思っています。私はいくつかのことを試みましたが、応答が記憶に残っているように見えます。

logcatエラーは次のとおりです。

05-09 13:45:13.764: E/AndroidRuntime(2438): Uncaught handler: thread AsyncTask #2 exiting due to uncaught exception
05-09 13:45:13.784: E/AndroidRuntime(2438): java.lang.RuntimeException: An error occured while executing doInBackground()
05-09 13:45:13.784: E/AndroidRuntime(2438):     at android.os.AsyncTask$3.done(AsyncTask.java:200)
05-09 13:45:13.784: E/AndroidRuntime(2438):     at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
05-09 13:45:13.784: E/AndroidRuntime(2438):     at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
05-09 13:45:13.784: E/AndroidRuntime(2438):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
05-09 13:45:13.784: E/AndroidRuntime(2438):     at java.util.concurrent.FutureTask.run(FutureTask.java:137)
05-09 13:45:13.784: E/AndroidRuntime(2438):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068)
05-09 13:45:13.784: E/AndroidRuntime(2438):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561)
05-09 13:45:13.784: E/AndroidRuntime(2438):     at java.lang.Thread.run(Thread.java:1096)
05-09 13:45:13.784: E/AndroidRuntime(2438): Caused by: java.lang.OutOfMemoryError
05-09 13:45:13.784: E/AndroidRuntime(2438):     at java.lang.String.<init>(String.java:513)
05-09 13:45:13.784: E/AndroidRuntime(2438):     at org.apache.http.util.CharArrayBuffer.toString(CharArrayBuffer.java:261)
05-09 13:45:13.784: E/AndroidRuntime(2438):     at org.apache.http.util.EntityUtils.toString(EntityUtils.java:141)
05-09 13:45:13.784: E/AndroidRuntime(2438):     at org.apache.http.util.EntityUtils.toString(EntityUtils.java:146)
05-09 13:45:13.784: E/AndroidRuntime(2438):     at org.apache.http.impl.client.BasicResponseHandler.handleResponse(BasicResponseHandler.java:76)
05-09 13:45:13.784: E/AndroidRuntime(2438):     at org.apache.http.impl.client.BasicResponseHandler.handleResponse(BasicResponseHandler.java:59)
05-09 13:45:13.784: E/AndroidRuntime(2438):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:657)
05-09 13:45:13.784: E/AndroidRuntime(2438):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:627)
05-09 13:45:13.784: E/AndroidRuntime(2438):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:616)
05-09 13:45:13.784: E/AndroidRuntime(2438):     at com.nelissen.couchforwarder.couch.DownloadedActivity$ApiTask.doInBackground(DownloadedActivity.java:382)
05-09 13:45:13.784: E/AndroidRuntime(2438):     at com.nelissen.couchforwarder.couch.DownloadedActivity$ApiTask.doInBackground(DownloadedActivity.java:1)
05-09 13:45:13.784: E/AndroidRuntime(2438):     at android.os.AsyncTask$2.call(AsyncTask.java:185)
05-09 13:45:13.784: E/AndroidRuntime(2438):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
05-09 13:45:13.784: E/AndroidRuntime(2438):     ... 4 more
4

2 に答える 2

0

これは、コードに記述した文が原因で発生していると確信しています。

return client.execute(request, new BasicResponseHandler());  // inside doInBackground

同じために別の AsyncTask を作成し、この新しい AsyncTask を onPostExecute() メソッド内で実行することをお勧めします。

そしてもう一つはprocessJSON(result);、時間のかかるプロセスかもしれません。

于 2012-05-09T11:32:37.213 に答える