【问题标题】:Stack OverFlow error with http response Android带有 http 响应 Android 的 Stack OverFlow 错误
【发布时间】:2013-02-26 13:39:41
【问题描述】:

我有一个从互联网获取图像的后台工作人员。

现在,我在捕获后尝试获取图像时遇到了 Stack OverFlow。

这是我的代码

获取函数

    private InputStream fetch(String urlString) throws MalformedURLException, IOException, IllegalStateException, SocketTimeoutException { 

    HttpClient httpClient = new DefaultHttpClient(); 

    HttpParams params = httpClient.getParams();
    HttpConnectionParams.setConnectionTimeout(params, TIME_OUT);
    HttpConnectionParams.setSoTimeout(params, TIME_OUT);

    HttpGet request = new HttpGet(urlString); 
    HttpResponse response = httpClient.execute(request); 

    return response.getEntity().getContent(); 
} 

后台工作人员

static int tryouts = 0;
/**
 * Getting the bitmap from the web asynchronously 
 * @author orel.z
 * @version 1.0
 */
class BitmapWorkerTask extends AsyncTask<String, Void, Bitmap>
{
    @Override
    protected Bitmap doInBackground(String... params) {

        Bitmap bitmap = null;

        try
        {
            InputStream is = fetch(params[0]);
            bitmap = BitmapFactory.decodeStream(is);
            is.close();
            is = null;
            tryouts = 0;
        }
        catch(IOException exception)
        {
            if(tryouts < 3)
            {
                doInBackground(params);
                tryouts++;
            }
            else
            {
                tryouts = 0;
                bitmap = null;
            }
        }
        catch (OutOfMemoryError e) 
        {
            if(tryouts < 3)
            {
                System.gc();
                doInBackground(params);
                tryouts++;
            }
            else
            {
                tryouts = 0;
                bitmap = null;
            }
        }

        return bitmap;
    }
}

这是日志

02-26 15:26:31.616: E/Crittercism(16936): java.lang.StackOverflowError
02-26 15:26:31.616: E/Crittercism(16936):              at     java.lang.String.substring(String.java:1436)
02-26 15:26:31.616: E/Crittercism(16936):              at java.util.regex.Splitter.finishSplit(Splitter.java:105)
02-26 15:26:31.616: E/Crittercism(16936):              at java.util.regex.Splitter.fastSplit(Splitter.java:75)
02-26 15:26:31.616: E/Crittercism(16936):              at java.lang.String.split(String.java:1831)
02-26 15:26:31.616: E/Crittercism(16936):              at java.lang.String.split(String.java:1813)
02-26 15:26:31.616: E/Crittercism(16936):              at java.net.URI.isValidDomainName(URI.java:577)
02-26 15:26:31.616: E/Crittercism(16936):              at java.net.URI.isValidHost(URI.java:545)
02-26 15:26:31.616: E/Crittercism(16936):              at java.net.URI.parseAuthority(URI.java:491)
02-26 15:26:31.616: E/Crittercism(16936):              at java.net.URI.parseURI(URI.java:409)
02-26 15:26:31.616: E/Crittercism(16936):              at java.net.URI.<init>(URI.java:204)
02-26 15:26:31.616: E/Crittercism(16936):              at org.apache.http.impl.conn.ProxySelectorRoutePlanner.determineProxy(ProxySelectorRoutePlanner.java:198)
02-26 15:26:31.616: E/Crittercism(16936):              at org.apache.http.impl.conn.ProxySelectorRoutePlanner.determineRoute(ProxySelectorRoutePlanner.java:150)
02-26 15:26:31.616: E/Crittercism(16936):              at org.apache.http.impl.client.DefaultRequestDirector.determineRoute(DefaultRequestDirector.java:596)
02-26 15:26:31.616: E/Crittercism(16936):              at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:293)
02-26 15:26:31.616: E/Crittercism(16936):              at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
02-26 15:26:31.616: E/Crittercism(16936):              at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
02-26 15:26:31.616: E/Crittercism(16936):              at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
02-26 15:26:31.616: E/Crittercism(16936):              at com.tvincisdk.utils.ImageManager.fetch(ImageManager.java:405)
02-26 15:26:31.616: E/Crittercism(16936):              at com.tvincisdk.utils.ImageManager.access$3(ImageManager.java:396)
02-26 15:26:31.616: E/Crittercism(16936):              at com.tvincisdk.utils.ImageManager$BitmapWorkerTask.doInBackground(ImageManager.java:319)
02-26 15:26:31.616: E/Crittercism(16936):              at com.tvincisdk.utils.ImageManager$BitmapWorkerTask.doInBackground(ImageManager.java:329)
02-26 15:26:31.616: E/Crittercism(16936):              at com.tvincisdk.utils.ImageManager$BitmapWorkerTask.doInBackground(ImageManager.java:329)
02-26 15:26:31.616: E/Crittercism(16936):              at com.tvincisdk.utils.ImageManager$BitmapWorkerTask.doInBackground(ImageManager.java:329)
02-26 15:26:31.616: E/Crittercism(16936):              at com.tvincisdk.utils.ImageManager$BitmapWorkerTask.doInBackground(ImageManager.java:329)
02-26 15:26:31.616: E/Crittercism(16936):              at com.tvincisdk.utils.ImageManager$BitmapWorkerTask.doInBackground(ImageManager.java:329)
02-26 15:26:31.616: E/Crittercism(16936):              at com.tvincisdk.utils.ImageManager$BitmapWorkerTask.doInBackground(ImageManager.java:329)
02-26 15:26:31.616: E/Crittercism(16936):              at com.tvincisdk.utils.ImageManager$BitmapWorkerTask.doInBackground(ImageManager.java:329)
02-26 15:26:31.616: E/Crittercism(16936):              at com.tvincisdk.utils.ImageManager$BitmapWorkerTask.doInBackground(ImageManager.java:329)
02-26 15:26:31.616: E/Crittercism(16936):              at com.tvincisdk.utils.ImageManager$BitmapWorkerTask.doInBackground(ImageManager.java:329)
02-26 15:26:31.616: E/Crittercism(16936):              at com.tvincisdk.utils.ImageManager$BitmapWorkerTask.doInBackground(ImageManager.java:329)
02-26 15:26:31.616: E/Crittercism(16936):              at com.tvincisdk.utils.ImageManager$BitmapWorkerTask.doInBackground(ImageManager.java:329)
02-26 15:26:31.616: E/Crittercism(16936):              at com.tvincisdk.utils.ImageManager$BitmapWorkerTask.doInBackground(ImageManager.java:329)
02-26 15:26:31.616: E/Crittercism(16936):              at com.tvincisdk.utils.ImageManager$BitmapWorkerTask.doInBackground(ImageManager.java:329)
02-26 15:26:31.616: E/Crittercism(16936):              at com.tvincisdk.utils.ImageManager$BitmapWorkerTask.doInBackground(ImageManager.java:329)
02-26 15:26:31.616: E/Crittercism(16936):              at com.tvincisdk.utils.ImageManager$BitmapWorkerTask.doInBackground(ImageManager.java:329)
02-26 15:26:31.616: E/Crittercism(16936):              at com.tvincisdk.utils.ImageManager$BitmapWorkerTask.doInBackground(ImageManager.java:329)
02-26 15:26:31.616: E/Crittercism(16936):              at com.tvincisdk.utils.ImageManager$BitmapWorkerTask.doInBackground(ImageManager.java:329)
02-26 15:26:31.616: E/Crittercism(16936):              at com.tvincisdk.utils.ImageManager$BitmapWorkerTask.doInBackground(ImageManager.java:329)
02-26 15:26:31.616: E/Crittercism(16936):              at com.tvincisdk.utils.ImageManager$BitmapWorkerTask.doInBackground(ImageManager.java:329)
02-26 15:26:31.616: E/Crittercism(16936):              at com.tvincisdk.utils.ImageManager$BitmapWorkerTask.doInBackground(ImageManager.java:329)
02-26 15:26:31.616: E/Crittercism(16936):              at com.tvincisdk.utils.ImageManager$BitmapWorkerTask.doInBackground(ImageManager.java:329)
02-26 15:26:31.616: E/Crittercism(16936):              at com.tvincisdk.utils.ImageManager$BitmapWorkerTask.doInBackground(ImageManager.java:329)
02-26 15:26:31.616: E/Crittercism(16936):              at com.tvincisdk.utils.ImageManager$BitmapWorkerTask.doInBackground(ImageManager.java:329)
02-26 15:26:31.616: E/Crittercism(16936):              at com.tvincisdk.utils.ImageManager$BitmapWorkerTask.doInBackground(ImageManager.java:329)
02-26 15:26:31.616: E/Crittercism(16936):              at com.tvincisdk.utils.ImageManager$BitmapWorkerTask.doInBackground(ImageManager.java:329)
02-26 15:26:31.616: E/Crittercism(16936):              at com.tvincisdk.utils.ImageManager$BitmapWorkerTask.doInBackground(ImageManager.java:329)
02-26 15:26:31.616: E/Crittercism(16936):              at com.tvincisdk.utils.ImageManager$BitmapWorkerTask.doInBackground(ImageManager.java:329)
02-26 15:26:31.616: E/Crittercism(16936):              at com.tvincisdk.utils.ImageManager$BitmapWorkerTask.doInBackground(ImageManager.java:329)
02-26 15:26:31.616: E/Crittercism(16936):              at com.tvincisdk.utils.ImageManager$BitmapWorkerTask.doInBackground(ImageManager

【问题讨论】:

    标签: java android backgroundworker stack-overflow


    【解决方案1】:

    这是一个更简单的逻辑。

    class BitmapWorkerTask extends AsyncTask<String, Void, Bitmap>
    {
        @Override
        protected Bitmap doInBackground(String... params) {
    
            Bitmap bitmap = null;
    
            for (int tryouts=0; tryouts<3; tryouts++) {
                try
                {
                    InputStream is = fetch(params[0]);
                    bitmap = BitmapFactory.decodeStream(is);
                    is.close();
                    is = null;
    
                    break;
                }
                catch(IOException exception)
                {
                    bitmap = null;
                }
                catch (OutOfMemoryError e) 
                {
                    System.gc();
                    bitmap = null;
                }
            }
    
            return bitmap;
        }
    }
    

    【讨论】:

      【解决方案2】:

      是因为您的tryouts++; 在您的doInBackground() 呼叫之后吗?这不会导致tryouts 永远不会达到 3 吗?

      尝试:

       tryouts++;
       return doInBackground(params);
      

      看看会发生什么。

      另外,你应该返回doInBackground(params);的结果

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-08-10
        • 1970-01-01
        • 2018-09-03
        • 2018-03-06
        • 2019-08-25
        相关资源
        最近更新 更多