2012-12-04 15 views
0

我有一個Async正在運行以從我創建的頁面獲取數據。它得到的文字很好,但是當我嘗試通過另一個類從圖像src中獲取圖像時,應用程序強制關閉。下面是這隊關閉代碼:當異步嘗試從url獲取位圖時,App強制關閉

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中,這與我的第一個類有什麼不同?

沮喪。

回答

6

您不能從後臺線程修改UI

移動ivDangerRose.setImageBitmap(bimage);onPostExecute

+0

謝謝。我似乎無法通過我厚厚的頭骨得到這個。 – jasonflaherty

+0

感謝您給我們啓示:P. –

0

在doInBackground()中,我們不應該訪問活動的內容。

1

在方法doInBackground

remove --> ivDangerRose.setImageBitmap(bimage); 

因爲你不能在後臺進程修改UI。

如果你仍然想要你可以嘗試runOnUiThread方法

相關問題