0

I want to fetch some data from website and i am using jsoup for that.But there is a problem, when i use jsoup in an asynctask it work well but i am going to this process via a navigation view and when i click to an item it starts but navigation view is not closing and progress bar is not working,so i coulnd't know what should i do.

The question is:

Should i try to use different method like(threads , asynctaskloader etc.) or is there a way to prevent these problems.

Here is my onCreateView method of fragment :

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState)
{
    View rootView = inflater.inflate(R.layout.tab_fragment_container, container, false);



    newspapers = readFromFile("20 Name.txt");
    newspapersPath = readFromFile("20 Path.txt");



    FetchingInstantNews fetchingInstantNews = new FetchingInstantNews((AppCompatActivity)getActivity(),newspapers,newspapersPath);

    try
    {
        cardItems = fetchingInstantNews.execute().get();
    }
    catch (Exception ex)
    {
        ex.printStackTrace();
    }


    mRecylerView = (RecyclerView)rootView.findViewById(R.id.recyclerView);
    setupRecyclerView(mRecylerView);

    return rootView;
}

Here is my asynctask class:

public class FetchingInstantNews   extends  AsyncTask<Void,Void,ArrayList<CardItem>>
{
private String[] newspapers,newspapersPath;

private AppCompatActivity activity;
private ProgressDialog progressDialog;

private Document doc,innerDoc;
private Elements[] elementses = new Elements[14];

private static String site,innerSite;

public FetchingInstantNews(AppCompatActivity activity,String[] newspapers,String[] newspapersPath)
{
    this.newspapers = newspapers;
    this.newspapersPath = newspapersPath;
    this.activity = activity;
}

@Override
protected void onPreExecute()
{
    super.onPreExecute();

    progressDialog = new ProgressDialog(activity);
    progressDialog.setTitle("Haberler");
    progressDialog.setMessage("Haberleriniz Hazırlanıyor..");
    progressDialog.setIndeterminate(false);

}

@Override
protected ArrayList<CardItem> doInBackground(Void... voids)
{
    ArrayList<CardItem> cardViews = new ArrayList<>();

    for(int i=0;i<newspapers.length;i++)
    {

        site = newspapersPath[i];

        try
        {
            doc = Jsoup.connect(site).timeout(120*1000)
                    .userAgent("Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:25.0) Gecko/20100101 Firefox/25.0")
                    .referrer("http://www.google.com")
                    .get();

            elementses[0] = doc.select("div[class=wrapper-new]");
            elementses[1] = elementses[0].select("section[id=top]");
            elementses[2] = elementses[1].select("section[class=manset-wrap c]");
            elementses[3] = elementses[2].select("div[class=site-box box box-list]");
            elementses[4] = elementses[3].select("div[class=us]");
            elementses[5] = elementses[4].select("div[class=sol]");
            elementses[6] = elementses[5].select("div[class=manset]");
            elementses[7] = elementses[6].select("div[class=m-item]");
            elementses[8] = elementses[7].select("article");

            int perCount=0;

            for (Element articleItem : elementses[8])
            {

                if(perCount >= 3)
                {
                    break;
                }

                CardItem cardItem = new CardItem();

                elementses[9] = articleItem.select("a");

                cardItem.setPubDate(elementses[9].select("meta[itemprop=datePublished]").attr("content")); //Date
                cardItem.setDescription(elementses[9].select("meta[itemprop=headline]").attr("content")); // desc
                cardItem.setThumbnailUrl(elementses[9].select("img").attr("data-src")); // thumb



                try
                {

                    elementses[10] = elementses[6].select("nav");
                    elementses[11] = elementses[10].select("div[class=sol]").select("span");

                    cardItem.setName(elementses[11].text().replace("Son","")); // title

                }
                catch (Exception ex)
                {
                    ex.printStackTrace();
                }

                try
                {
                    innerSite = elementses[9].attr("href");

                    innerDoc = Jsoup.connect(innerSite).timeout(100*1000)
                            .userAgent("Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:25.0) Gecko/20100101 Firefox/25.0")
                            .referrer("http://www.google.com")
                            .get();

                    elementses[12] = innerDoc.select("div[class=flexwrap]");
                    elementses[13] = elementses[12].select("iframe");

                    cardItem.setPath(elementses[13].attr("src"));

                }
                catch (Exception ex)
                {
                    ex.printStackTrace();
                }


                perCount++;


                cardViews.add(cardItem);
            }
        }
        catch (Exception ex)
        {
            ex.printStackTrace();
        }
    }

    return cardViews;
}

@Override
protected void onPostExecute(ArrayList<CardItem> aVoid)
{
    progressDialog.dismiss();
    super.onPostExecute(aVoid);
}
}

Here is my Main Activity:

private Toolbar mToolbar;
private DrawerLayout mDrawerLayout;
private NavigationView mNavigationView;
private ActionBarDrawerToggle mActionBarDrawerToggle;
private RelativeLayout mStockLayout;
private TabLayout mTabLayout;
private FragmentManager mFragmentManager;
private FragmentTransaction mFragmentTransaction;


@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mToolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(mToolbar);

    getSupportActionBar().setHomeButtonEnabled(true);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);

    mFragmentManager = getSupportFragmentManager();
    mFragmentTransaction = mFragmentManager.beginTransaction();

    mDrawerLayout = (DrawerLayout)findViewById(R.id.drawer_layout);



    mNavigationView = (NavigationView) findViewById(R.id.navigation_view);

    if (mNavigationView != null)
    {
        setupDrawerContent(mNavigationView);
    }


    mActionBarDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, mToolbar, R.string.app_name, R.string.app_name) {

        @Override
        public void onDrawerOpened(View drawerView)
        {
            super.onDrawerOpened(drawerView);
        }

        @Override
        public void onDrawerClosed(View drawerView)
        {
            super.onDrawerClosed(drawerView);
        }
    };


    mFragmentTransaction.replace(R.id.frame,new TabFragmentsContainer());

    mDrawerLayout.setDrawerListener(mActionBarDrawerToggle);

    mActionBarDrawerToggle.syncState();

}

private void setupDrawerContent(NavigationView navigationView)
{
    navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener()
    {
        @Override
        public boolean onNavigationItemSelected(MenuItem menuItem)
        {
            menuItem.setChecked(true);

            switch (menuItem.getItemId())
            {
                case R.id.anasayfa:

                    mDrawerLayout.closeDrawers();
                    changeFragment(new FragmentsContainer(),true);

                    break;
                case R.id.anlık:
                    if(mDrawerLayout.isDrawerOpen(mNavigationView))
                    {
                        mDrawerLayout.closeDrawer(mNavigationView);

                    }
                    else
                    {
                        mDrawerLayout.openDrawer(mNavigationView);
                    }

                    changeFragment(new TabFragmentsContainer(),false);
                    break;
                case R.id.ilkler:
                    Log.d("Frag","İlkler");
                    break;
                case R.id.ulusal:
                    Log.d("Frag","Ulusal");
                    break;
            }



            return true;
        }
    });
}

Thanks in advance!.

  • Excuse me, maybe it's not asynctask your problem, as you proper said, "it work well". I'm using jsoup in asynctask and it's fair good. Try to rethink, reproject, redesign your navigation model, see what people are doing in cases like yours. Best. – statosdotcom Jul 09 '16 at 04:09
  • I tried to use asynctask without navigation view.Asynctask and progress bar both are worked . But when i tried to open fragment that contain asynctask for fetch the data via navigation view item,Navigation view is not closing ,progress bar is not showing only the screen is freezing.When the process completed it comes back to normal.So I couldnt understand what should i do.Thanks for the comment!. – Alperen Adatepe Jul 09 '16 at 04:20
  • Oh, I see now your difficulties, sorry. Let's find a way for you. I suggest you edit your answer and provide some key parts of your code for the world to see. Certainlly you will get insights from the community. Thank you. – statosdotcom Jul 09 '16 at 04:36
  • See also: http://stackoverflow.com/a/35695852/363573 – Stephan Jul 09 '16 at 06:53

1 Answers1

0

Here's the thing, you really should not use your AsyncTask with get(). The get() method will block your UI thread which is likely the reason why your progress bar is not displayed and navigation drawer not closing.

Instead you should implement a callback mechanism, that is, tell your AsyncTask to call you back when the task is finished. Below is an example for your case:

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState)
{
    View rootView = inflater.inflate(R.layout.tab_fragment_container, container, false);

    newspapers = readFromFile("20 Name.txt");
    newspapersPath = readFromFile("20 Path.txt");

    FetchingInstantNews fetchingInstantNews = new FetchingInstantNews((AppCompatActivity)getActivity(),newspapers,newspapersPath);

    try
    {
        fetchingInstantNews.execute(); // do not call get()
    }
    catch (Exception ex)
    {
        ex.printStackTrace();
    }

    cardItems = new ArrayList<CardItems>(); // initialise recycler view with an empty list for now, because AsyncTask will not finish before you setup RecyclerView.
    mRecylerView = (RecyclerView)rootView.findViewById(R.id.recyclerView);
    setupRecyclerView(mRecylerView);

    return rootView;
}

// This method is called AFTER asynctask is finished
public void stepsAfterAsyncTask(ArrayList<CardItem> result)
{
    cardItems = result;
    // Re-initialise adapter with result data
    mRecylerView = (RecyclerView)rootView.findViewById(R.id.recyclerView);
    setupRecyclerView(mRecylerView);
    // make sure you notify adapter to use the new cardItems
    mRecylerView.getAdapter().notifyDataSetChanged();
}

Your AsyncTask:

public class FetchingInstantNews   extends  AsyncTask<Void,Void,ArrayList<CardItem>>
{
private String[] newspapers,newspapersPath;

//....
//....

@Override
protected void onPostExecute(ArrayList<CardItem> result)
{
    activity.stepsAfterAsyncTask(result); // call back your activity with the result
    progressDialog.dismiss();
    super.onPostExecute(result);
}
}

I don't know what your setupRecyclerView method looks like, so you will need to make changes according to your needs.

Joel Min
  • 3,387
  • 3
  • 19
  • 38