Charlie
Charlie

Reputation: 325

Android: put URL code in AsyncTask

How I can place the text below in AsyncTask? My problem is that by placing the code directly I get an error NetworkOnMainThreadException. I need any help please. Thanks

try {
    URL myFileUrl = new URL ("http://.../cercanias.png");
    HttpURLConnection conn = (HttpURLConnection) myFileUrl.openConnection();
    conn.setDoInput(true);
    conn.connect();

    InputStream is = conn.getInputStream();
    Bitmap bm = BitmapFactory.decodeStream(is);

    FileOutputStream out = new FileOutputStream(getCacheDir() + "cercanias.png");
    bm.compress(Bitmap.CompressFormat.PNG, 90, out);

    SubsamplingScaleImageView imageView = (SubsamplingScaleImageView)findViewById(R.id.imagenNitida);

    imageView.setImageFile(getCacheDir() + "cercanias.png");

    out.close();

    if (savedInstanceState != null &&
            savedInstanceState.containsKey(STATE_SCALE) &&
            savedInstanceState.containsKey(STATE_CENTER_X) &&
            savedInstanceState.containsKey(STATE_CENTER_Y)) {

        imageView.setScaleAndCenter(savedInstanceState.getFloat(STATE_SCALE), 
                new PointF(savedInstanceState.getFloat(STATE_CENTER_X), 
                        savedInstanceState.getFloat(STATE_CENTER_Y)));
    }
} catch (IOException e) {
}

Upvotes: 0

Views: 437

Answers (4)

Junaid
Junaid

Reputation: 7860

Here you go: There are three steps to an AsyncTask, preExecute(), postExecute() and doInBackground. The names are self explanatory. preExecute() for everything which has to be done before execution, postExecute for everything after the execution and doInBackground for the process which is time consuming.

Simple example:

public class HeavyProcess extends AsyncTask<Void, Void, Void> {
        ProgressDialog Asycdialog = new ProgressDialog(getActivity());

        protected void onPostExecute(String result) {

            //After execution execute this
            super.onPostExecute(result);
        }

        @Override
        protected void onPreExecute() {
            //Before execution do this, like init a progress dialog
            super.onPreExecute();

        }

        @Override
        protected String doInBackground(Void... params) {
            //Do the time consuming work here
            return "";
        }
    }

now in your case: create a function with all your code:

public void timeTask(){

try {
    URL myFileUrl = new URL ("put your URL here");
    HttpURLConnection conn = (HttpURLConnection) myFileUrl.openConnection();
    conn.setDoInput(true);
    conn.connect();

    InputStream is = conn.getInputStream();
    Bitmap bm = BitmapFactory.decodeStream(is);

    FileOutputStream out = new FileOutputStream(getCacheDir() + "cercanias.png");
    bm.compress(Bitmap.CompressFormat.PNG, 90, out);

    SubsamplingScaleImageView imageView = (SubsamplingScaleImageView)findViewById(R.id.imagenNitida);

    imageView.setImageFile(getCacheDir() + "cercanias.png");

    out.close();


    }
} catch (IOException e) {
}

}

Then call the timeTask() function from doInBackground();

Upvotes: 0

cokeby190
cokeby190

Reputation: 609

You would just need to break this code into portions and fit them into AsyncTask :

public class checkGB_status_Async extends AsyncTask<Void, Void, Bitmap> {

@Override
protected Bitmap doInBackground(Void... params) {
try {
    URL myFileUrl = new URL ("http://.../cercanias.png");
    HttpURLConnection conn = (HttpURLConnection) myFileUrl.openConnection();
    conn.setDoInput(true);
    conn.connect();

    InputStream is = conn.getInputStream();
    Bitmap bm = BitmapFactory.decodeStream(is);

    return bm;
} catch (IOException e) {
}
}

protected void onPostExecute(Bitmap result) {

    FileOutputStream out = new FileOutputStream(getCacheDir() + "cercanias.png");
    result.compress(Bitmap.CompressFormat.PNG, 90, out);

    SubsamplingScaleImageView imageView =       (SubsamplingScaleImageView)findViewById(R.id.imagenNitida);

    imageView.setImageFile(getCacheDir() + "cercanias.png");

    out.close();

    if (savedInstanceState != null &&
            savedInstanceState.containsKey(STATE_SCALE) &&
            savedInstanceState.containsKey(STATE_CENTER_X) &&
            savedInstanceState.containsKey(STATE_CENTER_Y)) {

    imageView.setScaleAndCenter(savedInstanceState.getFloat(STATE_SCALE), 
            new PointF(savedInstanceState.getFloat(STATE_CENTER_X), 
                    savedInstanceState.getFloat(STATE_CENTER_Y)));
}
}

Upvotes: 0

Biraj Zalavadia
Biraj Zalavadia

Reputation: 28484

Do this way

new AsyncTask<Void, Void, String>() {

            @Override
            protected String doInBackground(Void... arg0) {

                try {
                    URL myFileUrl = new URL("http://.../cercanias.png");
                    HttpURLConnection conn = (HttpURLConnection) myFileUrl.openConnection();
                    conn.setDoInput(true);
                    conn.connect();

                    InputStream is = conn.getInputStream();
                    Bitmap bm = BitmapFactory.decodeStream(is);

                    FileOutputStream out = new FileOutputStream(getCacheDir() +File.separator+ "cercanias.png");
                    bm.compress(Bitmap.CompressFormat.PNG, 90, out);
                    out.close();
                    conn.disconnect();
                    bm.recycle();

                    return "cercanias.png";

                } catch (IOException e) {
                }
                return null;
            }

            protected void onPostExecute(String result) {
                if (result != null) {
                    SubsamplingScaleImageView imageView = (SubsamplingScaleImageView) findViewById(R.id.imagenNitida);

                    imageView.setImageFile(getCacheDir() +File.separator+ result);

                    if (savedInstanceState != null && savedInstanceState.containsKey(STATE_SCALE) && savedInstanceState.containsKey(STATE_CENTER_X)
                            && savedInstanceState.containsKey(STATE_CENTER_Y)) {

                        imageView.setScaleAndCenter(savedInstanceState.getFloat(STATE_SCALE),
                                new PointF(savedInstanceState.getFloat(STATE_CENTER_X), savedInstanceState.getFloat(STATE_CENTER_Y)));
                    }
                }
            };
        }.execute();

Upvotes: 0

Karthick pop
Karthick pop

Reputation: 616

 class TestAsyncTask extends AsyncTask<String, Integer, Integer> {

     protected Integer doInBackground(String... strings) {
    // Long running task - say processing of each passed string

     URL myFileUrl = new URL ("http://.../cercanias.png");
     HttpURLConnection conn = (HttpURLConnection) myFileUrl.openConnection();
     conn.setDoInput(true);
     conn.connect();

     InputStream is = conn.getInputStream();
     Bitmap bm = BitmapFactory.decodeStream(is);

      FileOutputStream out = new FileOutputStream(getCacheDir() + "cercanias.png");
     bm.compress(Bitmap.CompressFormat.PNG, 90, out);
     out.close();
    return 0;
}


protected void onPostExecute(Integer result){
    Log.d("TestP", "AsyncTask returned : " + result);
 SubsamplingScaleImageView imageView = (SubsamplingScaleImageView)findViewById(R.id.imagenNitida);

imageView.setImageFile(getCacheDir() + "cercanias.png");


if (savedInstanceState != null &&
        savedInstanceState.containsKey(STATE_SCALE) &&
        savedInstanceState.containsKey(STATE_CENTER_X) &&
        savedInstanceState.containsKey(STATE_CENTER_Y)) {

    imageView.setScaleAndCenter(savedInstanceState.getFloat(STATE_SCALE), 
            new PointF(savedInstanceState.getFloat(STATE_CENTER_X), 
                    savedInstanceState.getFloat(STATE_CENTER_Y)));
}
}

Upvotes: 2

Related Questions