【问题标题】:Some images not loading on Android 2.2.1某些图像无法在 Android 2.2.1 上加载
【发布时间】:2014-04-06 20:59:53
【问题描述】:

我有一个应用程序,它使用 URL 将图像加载到位图中,最近收到了一封来自 Android 2.2.1 用户的电子邮件,该用户遇到了一些图像无法加载的问题。我试过环顾四周,似乎无法找到未加载的图像之间的任何联系。此外,有时无法为她加载的图像会重新开始工作,就像没有任何问题一样。我从未听说过任何更高版本的 Android 存在此问题,因此我认为这是 2.2.1 特有的问题。如果有人可以向我解释出了什么问题以及(如果可能的话)如何解决它,我将不胜感激。

以下是相关代码:

public class htmlGrabber extends AsyncTask<String, Void, String>{

        @Override
        protected String doInBackground(String... params) {
             try {
                    return getHtml();
                } 
                catch (IOException e) {
                    problem();
                    return null;
                }
        }//end of doInBackground

        @Override
        protected void onPostExecute(String result){
                Loading.fa.finish();
                shared_preferences=getSharedPreferences("shared_preferences_test", MODE_PRIVATE);
                shared_preferences_editor = shared_preferences.edit();
                shared_preferences_editor.putString("url_key", current);
                shared_preferences_editor.commit();
                TouchImageView img = (TouchImageView) findViewById(R.id.img);
                img.setImageBitmap(bitmap);
            }
        }

    public String getHtml() throws IllegalStateException, IOException{
        //gets html from the url stored in current, then parses through it and extracts the image url, then converts 
        //it into a bitmap image
        String html = "";

            HttpClient client = new DefaultHttpClient();
            HttpGet request = new HttpGet(current);
            HttpResponse response = client.execute(request);
            InputStream in = response.getEntity().getContent();
            BufferedReader reader = new BufferedReader(new InputStreamReader(in));
            StringBuilder str = new StringBuilder();
            String line = null;
            while((line = reader.readLine()) != null)
            {
                str.append(line);
            }
            in.close();
            html = str.toString();

            /* Edited out the code that parses through the HTML looking for the image URL. The image URL is stored in the string "link"

            try {
                bitmap = BitmapFactory.decodeStream((InputStream)new URL(link).getContent());
            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        return html;
    }//end of getHtml


}//end of htmlGrabber

如果您需要任何澄清,请告诉我!

【问题讨论】:

    标签: android bitmap android-asynctask android-imageview


    【解决方案1】:

    当您尝试使用 android 2.2.1 时,您也会遇到这个问题吗? 具体什么时候?

    因为如果这个 AsyncTask 被一个活动午餐,那么它取决于这个活动(如果你改变方向或其他什么,任务将被杀死并再次午餐),并且可能是这种行为在她的手机……考虑缓存图片会更好……

    你也可以看到这个question,它更多地解释了Android中AsyncTask定义的问题,以及这个定义被改变了多少次;所以在每个版本中它的工作方式不同是正常的。 在documentation 他们说:

    首次引入时,AsyncTask 是在单个后台线程上串行执行的。从 DONUT 开始,这被更改为允许多个任务并行运行的线程池。从 HONEYCOMB 开始,任务恢复到在单个线程上执行,以避免并行执行导致的常见应用程序错误。如果你真的想要并行执行,你可以使用这个方法的 executeOnExecutor(Executor, Params...) 版本和 THREAD_POOL_EXECUTOR;但是,请参阅那里的评论以获取有关其使用的警告。 executeOnExecutor() 和 THREAD_POOL_EXECUTOR 都在 API 级别 11(Android 3.0.x,HONEYCOMB)中添加。

    --> 这意味着如果你创建两个 AsyncTask 来下载两个文件,第二个下载将在第一个完成之前不会开始。如果您通过两台服务器聊天,而第一台服务器已关闭,则在与第一台服务器的连接超时之前,您将无法连接到第二台服务器。 (当然,除非您使用新的 API11 功能,但这会使您的代码与 2.x 不兼容)。

    如果您想同时针对 2.x 和 3.0+,那么事情就变得非常棘手。

    我建议以 universal image loader 为例,这是一个很好的、“著名”且非常简单的 API,用于加载图片和自动处理缓存...

    实际上,我使用的是通用图像加载器;该解决方案与缓存的事实无关,但与此 Loader 的实例与活动的上下文无关(其方法相关但通过缓存处理活动的生命周期)这一事实,这意味着您的任务不会被 Activity 的 onDestroy() 完全杀死并重新启动。您可以打开它的一个实例,然后将其方法用于所有应用程序。当你想杀死这个实例时,你调用它自己的 Destroy。

    我不能说,如果这肯定会解决您的问题。我认为您也无法在没有测试的情况下回答这个问题......但它可能会解决其他问题......

    希望我能帮上忙……

    【讨论】:

    • 由于我没有对设备的物理访问权限,我不知道何时会发生任何类型的错误(甚至无法查看 logcat)。 Async 正在由一个活动启动,并且在此期间活动没有更改(旋转等),这让我相信这是 2.2.1 和 Async 的问题。因此,您是说 Async 在 2.x 版本中的工作方式可能与在 3.x 版本中不同。缓存图片会帮助解决这个问题,还是他们升级安卓版本的最佳解决方案?感谢您的回复!
    • 我更新了我的答案,以澄清和回答您的问题。简而言之,这个 Loader 实例独立于 Activity 的 Context。
    • 所以你的意思是,通过应用通用图像加载器和缓存,AsyncTask 将不会绑定到任何特定的活动,并且将始终在后台运行,直到手动终止。在运行时,任何活动都可以访问它的方法,并且可以在不破坏 AsyncTask 的情况下销毁所述活动?
    • 那种;可以暂停/重新启动但不能终止。我希望我有所帮助
    • 是的,您在帮助我理解这个问题方面非常有帮助!此外,Universal Image Loader 对我也非常有用,因为我一直想为图像设置缓存。非常感谢您的帮助!
    猜你喜欢
    • 2013-09-21
    • 1970-01-01
    • 2015-02-07
    • 1970-01-01
    • 1970-01-01
    • 2021-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多