Java NetworkOnMainThreadException Android内异步

Java NetworkOnMainThreadException Android内异步,java,android,android-asynctask,Java,Android,Android Asynctask,除非我删除以下内容,否则我将获得例外: android:targetSdkVersion=15 我在这里的另一个线程中发现了这一点 然而,我已经用targetSdkVersion运行了几天了。这是我的密码: public class MainActivity extends BaseActivity { private TextView textView; private String url = "http://www.backcountryskiers.com/sac/sac

除非我删除以下内容,否则我将获得例外:

android:targetSdkVersion=15

我在这里的另一个线程中发现了这一点

然而,我已经用targetSdkVersion运行了几天了。这是我的密码:

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

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView = (TextView) findViewById(R.id.todaysReport);
        image = (ImageView) findViewById(R.id.dangerRose);

        fetcher task = new fetcher();
        task.execute();
    }

    public static Bitmap getBitmapFromURL(String src) {
        try {
            Log.e("src", src);
            URL url = new URL(src);
            HttpURLConnection connection = (HttpURLConnection) url
                    .openConnection();
            connection.setDoInput(true);
            connection.connect();
            InputStream input = connection.getInputStream();
            Bitmap myBitmap = BitmapFactory.decodeStream(input);
            Log.e("Bitmap", "returned");
            return myBitmap;
        } catch (IOException e) {
            e.printStackTrace();
            Log.e("Exception", e.getMessage());
            return null;
        }

    }

    class fetcher extends AsyncTask<String, Void, String> {
        private ProgressDialog dialog = new ProgressDialog(MainActivity.this);
        private Document doc = null;
        private Elements content = null;
        private Document parse = null;
        private String results = null;
        private Element dangerRatingImg = null;
        private String dangerRatingSrc = null;
        private Bitmap bimage;

        @Override
        protected String doInBackground(String... params) {

            try {
                // bimage = getBitmapFromURL(drUrl);
                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());
            }

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

            return results;
        }

        @Override
        protected void onPostExecute(String result) {
            // smooth out the long scrolling...
            textView.setMovementMethod(ScrollingMovementMethod.getInstance());

            // find rating image...
            dangerRatingImg = doc.select("img").first();
            dangerRatingSrc = dangerRatingImg.absUrl("src");
            // Get the rating image
            bimage = getBitmapFromURL(dangerRatingSrc);
            image.setImageBitmap(bimage);
            image.setPadding(10, 10, 10, 10);
            image.setScaleType(ScaleType.FIT_XY);

            // return the summary
            results = parse.select("#reportSummary").outerHtml();
            textView.setText(Html.fromHtml(results));
            textView.setPadding(10, 10, 10, 10);
            // ditch the dialog, it's all loaded.
            dialog.dismiss();

        }

        @Override
        protected void onPreExecute() {
            // before we get the async results show this
            dialog.setMessage("Loading Latest Update from the Sierra Avalanche Center...");
            dialog.show();
        }

    }

}
我有网络连接,可以很好地看到结果,去掉targetSdkVersion。。。但我知道这是不对的。谢谢大家

编辑:

您正在从onPostExecute调用getBitmapFromURL:

并在UI线程上运行。您需要将此代码放在其中,因为这是在新线程上运行的部分

更新:您可以按照注释中所述的方式重新组织代码:

@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());
    }

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

    // find rating image...
    dangerRatingImg = doc.select("img").first();
    dangerRatingSrc = dangerRatingImg.absUrl("src");
    // Get the rating image
    bimage = getBitmapFromURL(dangerRatingSrc);

    return results;
}

@Override
protected void onPostExecute(String result) {
    // smooth out the long scrolling...
    textView.setMovementMethod(ScrollingMovementMethod.getInstance());
    // Set the rating image
    image.setImageBitmap(bimage);
    image.setPadding(10, 10, 10, 10);
    image.setScaleType(ScaleType.FIT_XY);

    // return the summary
    results = parse.select("#reportSummary").outerHtml();
    textView.setText(Html.fromHtml(results));
    textView.setPadding(10, 10, 10, 10);
    // ditch the dialog, it's all loaded.
    dialog.dismiss();
}

@SLaks感谢提醒:我需要从doInBackground归还不止一件东西。我需要用别的方法吗?对于textView,我需要reportFull;对于ImageView,我需要DangeratingSrc。您已经对bimage=。。。在线程中;这就是你要说的。然后,结果将在使用它的onPostExecute中访问。和这很奇怪。。。我想知道是否有困难…只是注意到,因为我回答你的答案,它没有把你的名字放在那里。。。我的问题是,dangerRatingSrc来自用JSoup解析的内容。所以我必须在之后运行它。。。对吗?在下面的POST Execute://find rating image中。。。dangerRatingImg=doc.selectimg.first;dangerRatingSrc=dangerRatingImg.absUrlsrc;是的,我看到了。只需将JSoup解析也移动到doInBackground方法中。只要将textView.*和image.*保留在onPostExecute中,就可以了。我已经更新了我的帖子来展示这一点。
bimage = getBitmapFromURL(dangerRatingSrc);
@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());
    }

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

    // find rating image...
    dangerRatingImg = doc.select("img").first();
    dangerRatingSrc = dangerRatingImg.absUrl("src");
    // Get the rating image
    bimage = getBitmapFromURL(dangerRatingSrc);

    return results;
}

@Override
protected void onPostExecute(String result) {
    // smooth out the long scrolling...
    textView.setMovementMethod(ScrollingMovementMethod.getInstance());
    // Set the rating image
    image.setImageBitmap(bimage);
    image.setPadding(10, 10, 10, 10);
    image.setScaleType(ScaleType.FIT_XY);

    // return the summary
    results = parse.select("#reportSummary").outerHtml();
    textView.setText(Html.fromHtml(results));
    textView.setPadding(10, 10, 10, 10);
    // ditch the dialog, it's all loaded.
    dialog.dismiss();
}