Ahu Son
Ahu Son

Reputation: 155

call to AsyncTask method from fragment's onCreateView, fails

I have been trying to implement fragment layout and in one of the fragment classes i am using asynctask. so far I am unable to call the asynctask method from fragment's oncreateView. when i run the app its giving error 'unfortunately the app has stopped'

here is my fragment's code

package com.example.mohamed.myapplication;

import java.io.File;
import java.io.IOException;

import org.jsoup.Connection;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Attributes;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import android.app.ActionBar;
import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.app.ProgressDialog;
import android.content.Context;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v13.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.ListView;


import java.util.Locale;
import java.util.regex.Matcher;
import java.util.regex.Pattern;


public class FirstFragment extends Fragment {

    // URL Address
    String url = "http://www.androidbegin.com";
    ProgressDialog mProgressDialog;
    AsyncTask aTask;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

        new Title().execute();

        View rootView = inflater.inflate(R.layout.first_frag, container, false);
        return rootView;

    }


    // Title AsyncTask
    private class Title extends AsyncTask<Void, Void, Void> {
        String title;

//      Context mcontext;
//      public Title(Context c){
//          mcontext=c;
//      }
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
//              mProgressDialog = new ProgressDialog(mcontext);
//              mProgressDialog.setTitle("Android Basic JSoup Tutorial");
//              mProgressDialog.setMessage("Loading...");
//              mProgressDialog.setIndeterminate(false);
//              mProgressDialog.show();
        }

        @Override
        protected Void doInBackground(Void... params) {
            try {
                // Connect to the web site
                Document document = Jsoup.connect(url).get();
                // Get the html document title
                title = document.title();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            // Set title into TextView
            TextView txttitle = (TextView) getView().findViewById(R.id.First);
            txttitle.setText(title);
            mProgressDialog.dismiss();
        }
    }

    public static FirstFragment newInstance(String text) {

        FirstFragment f = new FirstFragment();
        Bundle b = new Bundle();
        b.putString("msg", text);

        f.setArguments(b);

        return f;

    }

}

so, what is the right way to call asynctask?

here is my logcat

12-01 14:44:40.052    1093-1093/com.example.mohamed.myapplication D/dalvikvm﹕ GC_FOR_ALLOC freed 49K, 3% free 3755K/3868K, paused 2ms, total 4ms
12-01 14:44:40.056    1093-1093/com.example.mohamed.myapplication D/dalvikvm﹕ GC_FOR_ALLOC freed 3K, 3% free 3973K/4092K, paused 2ms, total 2ms
12-01 14:44:40.064    1093-1093/com.example.mohamed.myapplication I/dalvikvm-heap﹕ Grow heap (frag case) to 6.356MB for 2536932-byte allocation
12-01 14:44:40.072    1093-1103/com.example.mohamed.myapplication D/dalvikvm﹕ GC_FOR_ALLOC freed <1K, 2% free 6450K/6572K, paused 5ms, total 5ms
12-01 14:44:40.180    1093-1093/com.example.mohamed.myapplication D/libEGL﹕ loaded /system/lib/egl/libEGL_genymotion.so
12-01 14:44:40.180    1093-1093/com.example.mohamed.myapplication D/﹕ HostConnection::get() New Host Connection established 0xb8a8f1c0, tid 1093
12-01 14:44:40.184    1093-1093/com.example.mohamed.myapplication D/libEGL﹕ loaded /system/lib/egl/libGLESv1_CM_genymotion.so
12-01 14:44:40.184    1093-1093/com.example.mohamed.myapplication D/libEGL﹕ loaded /system/lib/egl/libGLESv2_genymotion.so
12-01 14:44:40.224    1093-1093/com.example.mohamed.myapplication W/EGL_genymotion﹕ eglSurfaceAttrib not implemented
12-01 14:44:40.224    1093-1093/com.example.mohamed.myapplication E/OpenGLRenderer﹕ Getting MAX_TEXTURE_SIZE from GradienCache
12-01 14:44:40.228    1093-1093/com.example.mohamed.myapplication E/OpenGLRenderer﹕ MAX_TEXTURE_SIZE: 8192
12-01 14:44:40.232    1093-1093/com.example.mohamed.myapplication E/OpenGLRenderer﹕ Getting MAX_TEXTURE_SIZE from Caches::initConstraints()
12-01 14:44:40.232    1093-1093/com.example.mohamed.myapplication E/OpenGLRenderer﹕ MAX_TEXTURE_SIZE: 8192
12-01 14:44:40.236    1093-1093/com.example.mohamed.myapplication D/OpenGLRenderer﹕ Enabling debug mode 0

Upvotes: 2

Views: 4014

Answers (3)

Larry Schiefer
Larry Schiefer

Reputation: 15775

You have a race condition in your code. You are starting Title from you onCreateView() method, before it has returned the rootView. So, if the AsyncTask executes and completes before the Fragment is successfully taken to the running state, you will not get anything from getView() in your onPostExecute(). Also, the code doesn't show when the dialog is started, so you could instead be getting a NullPointerException when trying to access mProgressDialog.

BTW, your logat is incomplete: it is missing the actual crash stacktrace. Look for that and it will tell you exactly where your exception is happening.

Upvotes: 1

Blaze Tama
Blaze Tama

Reputation: 10948

I think the problem lies in this line :

TextView txttitle = (TextView) getView().findViewById(R.id.First);

Remove that line, and add this line in the onCreateView :

txttitle = (TextView) rootview.findViewById(R.id.First);

Make the txttitle a global variable.

After that, execute the AsyncTask in the onActivityCreated

Upvotes: 2

You trying to use AsyncTask in onCreateView before view created.

Try to call AsyncTask in onActivityCreated:

@Override
public void onActivityCreated(Bundle savedInstanceState) {
   super.onActivityCreated(savedInstanceState);
   new Title().execute();
}

Upvotes: 3

Related Questions