当异步尝试从URL获取位图时,应用程序强制关闭

时间:2012-12-04 06:02:41

标签: android bitmap android-asynctask

我正在运行Async以从我创建的页面获取数据。它得到的文本很好,但当我尝试通过另一个类从图像src获取图像时,应用程序强制关闭。以下是强制关闭的代码:

public class FullReportActivity extends NavigationActivity {
    private TextView textView;
    private String url = "http://www.backcountryskiers.com/sac/sac-full.html";
    private ImageView ivDangerRose;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        // tell which region this covers
        getSupportActionBar().setSubtitle("...from Sierra Avalanche Center");
        setContentView(R.layout.activity_fullreport);
        textView = (TextView) findViewById(R.id.todaysReport);
        ivDangerRose = (ImageView) findViewById(R.id.dangerRose);
        fetcher task = new fetcher();
        task.execute();
    }

    // GET THE IMAGE and RETURN IT
    public static Bitmap getBitmapFromURL(String src) {
        try {
            URL url = new URL(src);
            HttpURLConnection connection = (HttpURLConnection) url
                    .openConnection();
            connection.setDoInput(true);
            connection.connect();
            InputStream input = connection.getInputStream();
            Bitmap myBitmap = BitmapFactory.decodeStream(input);
            return myBitmap;
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
    }

    class fetcher extends AsyncTask<String, Void, String> {
        private ProgressDialog dialog = new ProgressDialog(
                FullReportActivity.this);
        private Document doc = null;
        private Document parse = null;
        private String results = null;
        private String reportDate = null;
        private Bitmap bimage = null;

        @Override
        protected String doInBackground(String... params) {
            try {
                doc = Jsoup.connect(url).get();
                Log.e("Jsoup", "...is working...");
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                Log.e("Exception", e.getMessage());
            }

            parse = Jsoup.parse(doc.html());
            results = doc.select("#fullReport").outerHtml();

            Element dangerRoseImg = doc.getElementById("reportRose")
                    .select("img").first();
            String dangerRoseSrc = dangerRoseImg.absUrl("src");
            Log.i("Report Rose IMG", dangerRoseSrc);
            bimage = getBitmapFromURL(dangerRoseSrc);
            ivDangerRose.setImageBitmap(bimage);

            return results;
        }

        @Override
        protected void onPostExecute(String result) {
            dialog.dismiss();
            // smooth out the long scrolling...
            textView.setMovementMethod(ScrollingMovementMethod.getInstance());
            reportDate = parse.select("#reportDate").outerHtml();
            textView.setText(Html.fromHtml(reportDate + results));
            textView.setPadding(30, 20, 20, 10);
        }

        @Override
        protected void onPreExecute() {
            dialog.setMessage("Loading Full Report from the Sierra Avalanche Center...");
            dialog.show();
        }

    }

}

我已经单独运行这个Async来获取图像,没有强制关闭,我不明白我在做什么不同,除了调用方法:

public class MainActivity extends Activity {
    public String durl = "http://www.sierraavalanchecenter.org/dangerrose.png?a=2955";
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);    

        new DownloadImageTask((ImageView) findViewById(R.id.dangerrose))
        .execute(durl);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }



    private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> {
          ImageView bmImage;

          public DownloadImageTask(ImageView bmImage) {
              this.bmImage = bmImage;
          }

          protected Bitmap doInBackground(String... urls) {
              String urldisplay = urls[0];
              Bitmap drose = null;
              try {
                InputStream in = new java.net.URL(urldisplay).openStream();
                drose = BitmapFactory.decodeStream(in);
              } catch (Exception e) {
                  Log.e("Error", e.getMessage());
                  e.printStackTrace();
              }
              return drose;
          }

          protected void onPostExecute(Bitmap result) {
              bmImage.setImageBitmap(result);
          }
        }
}

这个类获取图像src并创建一个位图并将其放入ImageView,这与我的第一个类不同???

受抑。

3 个答案:

答案 0 :(得分:6)

您无法从后台线程修改UI

ivDangerRose.setImageBitmap(bimage);

中移动onPostExecute

答案 1 :(得分:1)

方法doInBackground

remove --> ivDangerRose.setImageBitmap(bimage);

因为您无法在后台进程中修改UI。

如果您仍然想要,可以尝试runOnUiThread方法

答案 2 :(得分:0)

在doInBackground()中,我们不应该访问活动的内容。

相关问题