详细活动屏幕加载问题。它不断加载而不停止

时间:2018-09-20 05:50:14

标签: android android-layout loading

我的详细活动布局屏幕有问题。屏幕上将显示详细信息,但此后屏幕加载不会停止。显示屏幕中的详细信息后,我需要帮助来停止屏幕加载。

主布局活动会加载一定的时间,并且工作正常,但详细活动布局会继续加载而不停止。

The detail activity screen shows all the details but it keeps on loading and does not stop

DetailsFragment.java

public class DetailsFragment extends Fragment {

    private static final String LOG_TAG = DetailsFragment.class.getSimpleName();
    private static final String ARG_NEWS = "arg_news";
    private static final String SAVE_NEWS = "save_news";
    private static final String SAVE_FAVORITE_NEWS = "save_favorite_news";
    private static final String SAVE_FAVORITE_SORT = "save_favorite_sort";
    private static final String SAVE_FULLY_LOADED = "save_fully_loaded";
    private static final String SAVE_SHARE_MENU_VISIBILITY = "save_share_menu_visibility";

    private final ResponseReceiver mReceiver = new ResponseReceiver();
    private Context mContext;
    private News mNews;
    private ShareActionProvider mShareActionProvider;
    private MenuItem mShareMenuItem;
    private ImageView mPosterImageView;
    private OnLoadingFragmentListener mLoadingListener;
    private boolean mIsFavoriteNews;
    private boolean mIsFavoriteSort;
    private boolean mIsFullyLoaded;
    private boolean mIsShareMenuItemVisible;

    public DetailsFragment() {
        // Required empty public constructor
    }

    // Create new Fragment instance
    public static DetailsFragment newInstance(News newsSelected) {
        DetailsFragment fragment = new DetailsFragment();
        Bundle args = new Bundle();
        args.putParcelable(ARG_NEWS, newsSelected);
        fragment.setArguments(args);
        return fragment;
    }

    public static DetailsFragment newInstance() {
        DetailsFragment fragment = new DetailsFragment();
        return fragment;
    }

    // Listener to handle star button clicks. This button adds and remove news from
    // content provider
    private final View.OnClickListener mStarButtonOnClickListener = new View.OnClickListener() {
        public void onClick(View view) {

            // Can't save it to favorites db if news poster is not ready yet
            if (mPosterImageView != null && !Utils.hasImage(mPosterImageView)) {
                Toast.makeText(mContext, R.string.please_wait_poster_download,
                        Toast.LENGTH_SHORT).show();
                return;
            }

            if (mIsFavoriteNews) {
                if (removeFavoriteNews(mNews) > 0) {
                    Toast.makeText(mContext, R.string.success_remove_favorites, Toast
                            .LENGTH_SHORT)
                            .show();
                    ((ImageButton) view).setImageResource(R.drawable.ic_star_border);

                    // Delete poster image stored in internal storage
                    Utils.deleteFileFromInternalStorage(mContext, mNews.getTitle());

                    mIsFavoriteNews = false;
                } else {
                    Toast.makeText(mContext, R.string.fail_remove_favorites,
                            Toast.LENGTH_SHORT).show();
                }
            } else {
                if (addFavoriteNews(mNews) != null) {
                    Toast.makeText(mContext, R.string.success_add_favorites, Toast
                            .LENGTH_SHORT).show();
                    ((ImageButton) view).setImageResource(R.drawable.ic_star);

                    // Save poster image to internal storage
                    Bitmap posterBitmap = Utils.getBitmapFromImageView(mPosterImageView);
                    Utils.saveBitmapToInternalStorage(mContext, posterBitmap, mNews.getTitle());

                    mIsFavoriteNews = true;
                } else {
                    Toast.makeText(mContext, R.string.fail_add_favorites, Toast
                            .LENGTH_SHORT).show();
                }
            }
        }
    };

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        if (context instanceof OnLoadingFragmentListener) {
            mLoadingListener = (OnLoadingFragmentListener) context;
        } else {
            throw new RuntimeException(context.toString()
                    + " must implement OnLoadingInteractionListener");
        }

        mContext = context;
    }

    @Override
    public void onDetach() {
        super.onDetach();
        mLoadingListener = null;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        if (getArguments() != null) {
            mNews = getArguments().getParcelable(ARG_NEWS);
            mIsFavoriteNews = isFavoriteNews(mContext, mNews);
            mIsFavoriteSort = Utils.isFavoriteSort(mContext);
        }

        setHasOptionsMenu(true);
    }

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        inflater.inflate(R.menu.details_menu, menu);
    }

    @Override
    public void onPrepareOptionsMenu(Menu menu) {
        mShareMenuItem = menu.findItem(R.id.menu_item_share);
        mShareActionProvider = (ShareActionProvider) MenuItemCompat.getActionProvider
                (mShareMenuItem);

        setShareMenuItemAction();
        super.onPrepareOptionsMenu(menu);
    }

    private void setShareMenuItemAction() {
        if (mNews != null ) {
            //String videoKey = mNews.getVideos()[0].getKey();
            if (mShareActionProvider != null
                    && mShareMenuItem != null) {
                Intent shareIntent = new Intent(Intent.ACTION_SEND);
                shareIntent.setType("text/plain");

                mShareActionProvider.setShareIntent(shareIntent);
                mShareMenuItem.setVisible(true);
            }
        }
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putParcelable(SAVE_NEWS, mNews);
        outState.putBoolean(SAVE_FAVORITE_NEWS, mIsFavoriteNews);
        outState.putBoolean(SAVE_FAVORITE_SORT, mIsFavoriteSort);
        outState.putBoolean(SAVE_FULLY_LOADED, mIsFullyLoaded);
        outState.putBoolean(SAVE_SHARE_MENU_VISIBILITY, mIsShareMenuItemVisible);
    }

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

        if (mNews == null) {
            return null;
        }

        // Restore objects value
        if (savedInstanceState != null) {
            mNews = savedInstanceState.getParcelable(SAVE_NEWS);
            mIsFavoriteNews = savedInstanceState.getBoolean(SAVE_FAVORITE_NEWS);
            mIsFavoriteSort = savedInstanceState.getBoolean(SAVE_FAVORITE_SORT);
            mIsFullyLoaded = savedInstanceState.getBoolean(SAVE_FULLY_LOADED);
            mIsShareMenuItemVisible = savedInstanceState.getBoolean(SAVE_SHARE_MENU_VISIBILITY);
        }

        View view = inflater.inflate(R.layout.fragment_details, container, false);

        mPosterImageView = (ImageView) view.findViewById(R.id.news_img);

        Glide.with(mContext).load(mNews.getImageUri())
                .dontAnimate().into(mPosterImageView);

        TextView titleView = (TextView) view.findViewById(R.id.title_content);
        titleView.setText(mNews.getTitle());

        TextView publishDateView = (TextView) view.findViewById(R.id.publish_date_content);
        String date = Utils.formatDateForLocale(mNews.getPublishedDate());
        publishDateView.setText(date);

        TextView author = (TextView) view.findViewById(R.id.author_name);
        author.setText(mNews.getAuthor());

        TextView descriptionView = (TextView) view.findViewById(R.id.description_content);

        TextView fullNewsUrl = (TextView) view.findViewById(R.id.news_full);
        fullNewsUrl.setText(mNews.getFullNewsUrl());

        // In portuguese, some news does not contain overview data. In that case, displays
        // default text: @string/overview_not_available
        if (!TextUtils.isEmpty(mNews.getDescription())) {
            descriptionView.setText(mNews.getDescription());
        }

        ImageButton starButton = (ImageButton) view.findViewById(R.id.star_button);
        starButton.setOnClickListener(mStarButtonOnClickListener);

        if (mIsFavoriteNews) {
            starButton.setImageResource(R.drawable.ic_star);
        } else {
            starButton.setImageResource(R.drawable.ic_star_border);
        }

        starButton.setVisibility(View.VISIBLE);

        FrameLayout detailFrame = (FrameLayout) view.findViewById(R.id.detail_frame);
        detailFrame.setVisibility(View.VISIBLE);

        return view;
    }

    // Method that adds a News to content provider
    private Uri addFavoriteNews(News news) {

        Uri newsReturnUri = null;
        try {
            ContentValues newsContentValues = createNewsValues(news);
            newsReturnUri = mContext.getContentResolver().insert(FavoriteNewsContract
                    .NewsEntry
                    .CONTENT_URI, newsContentValues);

        } catch (SQLException e) {
            Log.d(LOG_TAG, "SQLException while adding news to Favorite db");
            e.printStackTrace();
        }

        return newsReturnUri;
    }

    // Method that removes a News from content provider
    private int removeFavoriteNews(News news) {

        int newsRemoved = mContext.getContentResolver().delete(FavoriteNewsContract
                        .NewsEntry.CONTENT_URI,
                FavoriteNewsContract
                        .NewsEntry._ID + " = ?", new String[]{news.getTitle()});

        return newsRemoved;
    }

    // Create news content values
    private ContentValues createNewsValues(News news) {
        ContentValues newsContentValues = new ContentValues();
//        newsContentValues.put(FavoriteNewsContract.NewsEntry._ID, Integer.parseInt(news
//                .getId()));
        newsContentValues.put(FavoriteNewsContract.NewsEntry.COLUMN_TITLE, news.getTitle());
        newsContentValues.put(FavoriteNewsContract.NewsEntry.COLUMN_PUBLISH_DATE, news
                .getPublishedDate());
        newsContentValues.put(FavoriteNewsContract.NewsEntry.COLUMN_AUTHOR, news
                .getAuthor());
        newsContentValues.put(FavoriteNewsContract.NewsEntry.COLUMN_DESCRIPTION, news
                .getDescription());
        newsContentValues.put(FavoriteNewsContract.NewsEntry.COLUMN_FULL_NEWS_URL, news
                .getFullNewsUrl());
        newsContentValues.put(FavoriteNewsContract.NewsEntry.COLUMN_IMG_URL, news
                .getImageUri()
                .toString());
        return newsContentValues;
    }


    // Method that query content provider and checks whether is a Favorite news or not
    private boolean isFavoriteNews(Context ctx, News news) {
        String newsID = news.getTitle();
        Cursor cursor = ctx.getContentResolver().query(FavoriteNewsContract.NewsEntry
                        .CONTENT_URI, null,
                FavoriteNewsContract.NewsEntry._ID + " = " + newsID, null, null);
        if (cursor != null && cursor.moveToNext()) {
            int newsIdColumnIndex = cursor.getColumnIndex(FavoriteNewsContract.NewsEntry._ID);
            if (TextUtils.equals(newsID, cursor.getString(newsIdColumnIndex))) {
                return true;
            }
        }

        if (cursor != null) {
            cursor.close();
        }

        return false;
    }

    @Override
    public void onResume() {
        super.onResume();

        if (mNews != null) {
            if (mReceiver != null) {
                LocalBroadcastManager.getInstance(mContext)
                        .registerReceiver(mReceiver, new IntentFilter(Constants
                                .ACTION_EXTRA_INFO_RESULT));
            }
            if (!mIsFullyLoaded && !mIsFavoriteSort) {
                Intent intent = new Intent(mContext, NewsIntentService.class);
                intent.setAction(Constants.ACTION_EXTRA_INFO_REQUEST);
                intent.putExtra(NewsIntentService.EXTRA_INFO_NEWS_ID, mNews.getTitle());
                mContext.startService(intent);

                if (mLoadingListener != null) {
                    mLoadingListener.onLoadingDisplay(true, true);
                }
            }
        }
    }

    @Override
    public void onPause() {
        super.onPause();
        if (mReceiver != null) {
            LocalBroadcastManager.getInstance(mContext).unregisterReceiver(mReceiver);
        }
    }

    // BroadcastReceiver for network call
    public class ResponseReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent == null || intent.getAction() == null) {
                return;
            }

            if (intent.getAction().equals(Constants.ACTION_EXTRA_INFO_RESULT)) {

                setShareMenuItemAction();
            } else {
                Toast.makeText(mContext, R.string.toast_failed_to_retrieve_data,
                        Toast.LENGTH_SHORT).show();
            }

            if (mLoadingListener != null) {
                mLoadingListener.onLoadingDisplay(true, false);
            }

            mIsFullyLoaded = true;
        }
    }
}

DetailsActivity.java

public class DetailsActivity extends AppCompatActivity implements OnLoadingFragmentListener {

    private static final String LOG_TAG = DetailsActivity.class.getSimpleName();

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

        if (savedInstanceState == null) {
            Intent intent = getIntent();
            if (intent != null && intent.hasExtra(Constants.EXTRA_NEWS)) {
                News news = intent
                        .getParcelableExtra(Constants.EXTRA_NEWS);

                DetailsFragment detailsFragment = DetailsFragment.newInstance(news);
                getSupportFragmentManager().beginTransaction()
                        .add(R.id.details_fragment_container, detailsFragment).commit();
            } else {
                Log.d(LOG_TAG, "Something went wrong. Intent doesn't have Constants.EXTRA_NEWS" +
                        " extra. Finishing DetailsActivity.");
                finish();
            }
        }
    }

    @Override
    public void onLoadingDisplay(boolean fromDetails, boolean display) {
        Fragment loadingFragment = getSupportFragmentManager()
                .findFragmentByTag(LoadingFragment.FRAGMENT_TAG);
        if (display && loadingFragment == null) {
            loadingFragment = LoadingFragment.newInstance();
            if (fromDetails) {
                getSupportFragmentManager().beginTransaction()
                        .add(R.id.details_fragment_container,
                                loadingFragment, LoadingFragment.FRAGMENT_TAG).commit();
            } else {
                getSupportFragmentManager().beginTransaction()
                        .add(R.id.news_fragment_container,
                                loadingFragment, LoadingFragment.FRAGMENT_TAG).commit();
            }
        } else if (!display && loadingFragment != null) {
            getSupportFragmentManager().beginTransaction()
                    .remove(loadingFragment).commit();
        }
    }
}

LoadingFragment.xml

public class LoadingFragment extends Fragment {

    public static final String FRAGMENT_TAG = LoadingFragment.class.getSimpleName();
    private static final String LOG_TAG = LoadingFragment.class.getSimpleName();

    public LoadingFragment() {
        // Required empty public constructor
    }

    public static LoadingFragment newInstance() {
        LoadingFragment fragment = new LoadingFragment();
        return fragment;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_loading, container, false);
        return view;
    }
}

fragment_loading.xml

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/semiTransparentBlack"
    android:clickable="true"
    tools:context=".ui.LoadingFragment">

    <ProgressBar
        android:id="@+id/progressBar"
        style="?android:attr/progressBarStyleLarge"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:gravity="center" />
</FrameLayout>

2 个答案:

答案 0 :(得分:0)

使用onDestroy

@Override
public void onDestroy() {
    super.onDestroy();    
    mLoadingListener = null;
}

,您还应该删除ResponseReceiver

    if (mLoadingListener != null) {
            mLoadingListener.onLoadingDisplay(true, false);
        }

答案 1 :(得分:0)

您很有可能需要在适当的时间将加载ViewProgressBar?)的可见性更改为INVISIBLEGONE,可能是在加载完成时。

如果加载的View包含在某种对话框中,则您需要在适当的时间将其消除。