0

作成したページからデータを取得するために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();
        }

    }

}

私はこの非同期を単独で実行して、強制的に閉じることなくそのような画像を取得しましたが、メソッドを呼び出す以外に何をしているのかわかりません:

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に配置します。ここでは、最初のクラスとは何が異なりますか?

欲求不満。

4

3 に答える 3

6

UIバックグラウンドスレッドから変更することはできません。

入居ivDangerRose.setImageBitmap(bimage);_onPostExecute

于 2012-12-04T06:09:01.013 に答える
1

メソッドdoInBackgroundで

remove --> ivDangerRose.setImageBitmap(bimage);

バックグラウンドプロセスでUIを変更することはできません。

それでも必要な場合は、runOnUiThreadメソッドを試すことができます

于 2012-12-04T06:17:35.630 に答える
0

doInBackground()では、アクティビティのコンテンツにアクセスしないでください。

于 2012-12-04T06:07:04.170 に答える