简体   繁体   English

启动画面使用AsyncTask

[英]Splash Screen using AsyncTask

I have a splash screen using AsyncTask , it will download some data from database and store the data in ArrayList . 我有一个使用AsyncTask的启动画面,它将从数据库下载一些数据并将数据存储在ArrayList This ArrayList will be used for RecyclerView in fragments of MainActivity.class . ArrayList将在MainActivity.class片段中用于RecyclerView

The problem is when I run the app from Android Studio to my phone, everything works perfectly. 问题是,当我从Android Studio运行应用程序到手机时,一切运行正常。 But, when I destroy the app and run it manually from my phone it will display blank white screen and then it will crash. 但是,当我销毁该应用程序并通过手机手动运行它时,它将显示空白屏幕,然后崩溃。 And if I run once again after it crashed, the app will work. 如果崩溃后我再次运行,该应用程序将运行。 So, this app will always work only if I run it from Android Studio or after it crashed. 因此,仅当我从Android Studio运行它或当它崩溃后,此应用程序始终可以运行。

The error says that it is caused by the empty list. 该错误表明它是由空列表引起的。 If I'm not mistaken, I think the AsyncTask doesn't seem to work properly after the activity is destroyed. 如果我没记错的话,我认为活动被销毁后, AsyncTask似乎无法正常工作。 But I don't know how to fix it. 但是我不知道如何解决。 Please help me to solve this problem. 请帮我解决这个问题。

SplashScreen.java SplashScreen.java

public class SplashScreenActivity extends AppCompatActivity {
    public static Event event;
    private static List<Feed> feedList;
    private static List<Event> eventList;
    private static List<Event> todayList;
    private static List<Event> upcomingList;
    private static List<Partner> partnerList;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_splashscreen);
        Time today = new Time(Time.getCurrentTimezone());
        today.setToNow();
        Config.TODAY_DATE = String.valueOf(today.monthDay) + "-" + String.valueOf(today.month) + "-" + String.valueOf(today.year);
        new DownloadData().execute("");
    }

    class DownloadData extends AsyncTask<String, Integer, String>
    {
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }

        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
            startActivity(new Intent(getBaseContext(), WelcomeActivity.class));
            finish();
        }

        @Override
        protected String doInBackground(String... params) {
            RequestHandler rh = new RequestHandler();
            String JSON_STRING = rh.sendGetRequest(Config.URL_GET_ALL_DATA);
            JSONObject jsonObject;
            eventList       = new ArrayList<>();
            todayList       = new ArrayList<>();
            upcomingList    = new ArrayList<>();
            partnerList     = new ArrayList<>();
            feedList        = new ArrayList<>();
            try {
                jsonObject = new JSONObject(JSON_STRING);

                JSONArray getEvent = jsonObject.getJSONArray(Config.TAG_JSON_EVENT);
                for (int i = 0; i < getEvent.length(); i++) {
                    int id              = getEvent.getJSONObject(i).getInt(Config.TAG_ID);
                    int eoId        = getEvent.getJSONObject(i).getInt(Config.TAG_EO_ID);
                    String eoName       = getEvent.getJSONObject(i).getString(Config.TAG_EO_NAME);
                    String title        = getEvent.getJSONObject(i).getString(Config.TAG_TITLE);
                    String day      = getEvent.getJSONObject(i).getString(Config.TAG_DAY);
                    String date         = getEvent.getJSONObject(i).getString(Config.TAG_DATE);
                    int price       = getEvent.getJSONObject(i).getInt(Config.TAG_PRICE);
                    event = new Event(id, eoId, eoName, title, day, date, price);
                    eventList.add(event);
                    if(Config.TODAY_DATE.equals(event.getDate())){
                        todayList.add(event);
                    } else {
                        upcomingList.add(event);
                    }

                }

                JSONArray getPartner = jsonObject.getJSONArray(Config.TAG_JSON_PARTNER);
                for (int i = 0; i < getPartner.length(); i++) {
                    int pId         = getPartner.getJSONObject(i).getInt(Config.TAG_ID);
                    String pName    = getPartner.getJSONObject(i).getString(Config.TAG_NAME);
                    String pEmail   = getPartner.getJSONObject(i).getString(Config.TAG_EMAIL);
                    String pPhone   = getPartner.getJSONObject(i).getString(Config.TAG_PHONE);
                    String pPhoto   = getPartner.getJSONObject(i).getString(Config.TAG_PHOTO_URL);
                    Partner partner = new Partner(pId, pName, pEmail, pPhone, pPhoto);
                    partnerList.add(partner);
                }

                JSONArray getArticle = jsonObject.getJSONArray(Config.TAG_JSON_ARTICLE);
                for (int i = 0; i < getArticle.length(); i++) {
                    int feedId              = getArticle.getJSONObject(i).getInt(Config.TAG_ID);
                    String feedAuthor       = getArticle.getJSONObject(i).getString(Config.TAG_FEED_AUTHOR);
                    String feedTitle        = getArticle.getJSONObject(i).getString(Config.TAG_FEED_TITLE);
                    String feedContent      = getArticle.getJSONObject(i).getString(Config.TAG_FEED_CONTENT);
                    String feedDate         = getArticle.getJSONObject(i).getString(Config.TAG_FEED_DATE);
                    String feedThumbnail    = getArticle.getJSONObject(i).getString(Config.TAG_FEED_THUMBNAIL);
                    Feed feed = new Feed(feedId, feedAuthor, feedTitle, feedContent, feedDate, feedThumbnail);
                    feedList.add(feed);
                }

            } catch (JSONException e) {
                e.printStackTrace();
            }
            return JSON_STRING;
        }

    }

    public static List<Feed> getFeedList(){ return feedList;}
    public static List<Event> getEventList() {return eventList;}
    public static List<Event> getTodayList() { return todayList;}
    public static List<Event> getUpcomingList() { return upcomingList;}
    public static List<Partner> getPartnerList() {return partnerList;}

}

DiscoverFragment.java DiscoverFragment.java

public class DiscoverFragment extends Fragment implements ViewPager.OnPageChangeListener, View.OnClickListener {

    protected View view;
    private LinearLayout pager_indicator;
    private int dotsCount;
    private ImageView[] dots;

    private List<Feed> feedList;
    private List<Event> eventList;
    private List<Partner> partnerList;

    public DiscoverFragment() {}

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

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

        RecyclerView recyclerViewEvent      = (RecyclerView) view.findViewById(R.id.discover_event_recycler_view);
        RecyclerView recyclerViewPartner    = (RecyclerView) view.findViewById(R.id.discover_partner_recycler_view);

        ClickableViewPager intro_images = (ClickableViewPager) view.findViewById(R.id.pager_introduction);
        pager_indicator         = (LinearLayout) view.findViewById(R.id.viewPagerCountDots);

        eventList       = SplashScreenActivity.getEventList();
        partnerList     = SplashScreenActivity.getPartnerList();
        feedList        = SplashScreenActivity.getFeedList();

        EventAdapter eventAdapter = new EventAdapter(getContext(), eventList);
        DiscoverPartnerAdapter discoverPartnerAdapter = new DiscoverPartnerAdapter(getContext(), partnerList);
    DiscoverFeedAdapter mAdapter = new DiscoverFeedAdapter(getContext(), feedList);

        final LinearLayoutManager layoutManagerEvent = new LinearLayoutManager(getContext());
        final LinearLayoutManager layoutManagerPartner = new LinearLayoutManager(getContext());

        layoutManagerEvent.setOrientation(LinearLayoutManager.HORIZONTAL);
        layoutManagerPartner.setOrientation(LinearLayoutManager.HORIZONTAL);

        addBottomDots(0);
        intro_images.setAdapter(mAdapter);
        intro_images.setCurrentItem(0);
        intro_images.addOnPageChangeListener(this);
        intro_images.setOnItemClickListener(new ClickableViewPager.OnItemClickListener() {
            @Override
            public void onItemClick(int position) {
                Config.FEED_ID = position;
                startActivity(new Intent(getContext(), ArticleActivity.class));
            }
        });

        return view;
    }


    private void addBottomDots(int currentPage) {
        dots = new ImageView[feedList.size()]; //the problem
        pager_indicator.removeAllViews();
        for (int i = 0; i < dots.length; i++) {
            dots[i] = new ImageView(getContext());
            dots[i].setImageDrawable(getResources().getDrawable(R.drawable.nonselecteditem_dot));
            LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
                    LinearLayout.LayoutParams.WRAP_CONTENT,
                    LinearLayout.LayoutParams.WRAP_CONTENT
            );
            params.setMargins(4, 0, 4, 0);
            pager_indicator.addView(dots[i], params);
        }
        if (dots.length > 0)
            dots[currentPage].setImageDrawable(getResources().getDrawable(R.drawable.selecteditem_dot));
    }


    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        }
    }

    @Override
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
    }

    @Override
    public void onPageSelected(int position) {
        addBottomDots(position);
        for (int i = 0; i < dotsCount; i++) {
            dots[i].setImageDrawable(getResources().getDrawable(R.drawable.nonselecteditem_dot));
        }
        dots[position].setImageDrawable(getResources().getDrawable(R.drawable.selecteditem_dot));
    }
}

LogCat LogCat

01-29 00:40:57.565 32535-32535/com.irmaelita.esodiaapp E/AndroidRuntime: FATAL EXCEPTION: main
                                                                         Process: com.irmaelita.esodiaapp, PID: 32535
                                                                         java.lang.NullPointerException: Attempt to invoke interface method 'int java.util.List.size()' on a null object reference
                                                                             at com.irmaelita.esodiaapp.fragment.DiscoverFragment.addBottomDots(DiscoverFragment.java:181)
                                                                             at com.irmaelita.esodiaapp.fragment.DiscoverFragment.onCreateView(DiscoverFragment.java:158)

feedList is null. feedList为null。 You create feedList instance when DownloadData task is executed. 您在执行DownloadData任务时创建feedList实例。 But you call feedList.size() in addBottomDots when fragment view should be created. 但是,应在创建片段视图时在addBottomDots调用feedList.size() So, most probably addBottomDots is called before DownloadData task is executed. 因此,最有可能在执行DownloadData任务之前调用addBottomDots You need to fix it. 您需要修复它。

The feedlist in your discover fragment is going empty while initializing. 发现片段中的供稿列表在初始化时将为空。 Please set a null check before doing so.It not about running from android studio.If I have understood it correctly you are trying to access a list from splasScreen activity after finishing it. 请在执行此操作之前先设置一个null检查。这与从android studio中运行无关。如果我对它的理解正确,则您尝试在完成后从splasScreenActivity访问列表。 ie in post execute you finish the current activity and the fragment is in main activity,so the list is going null.So if this is the case (and please correct me if not) then either download the data somewhere centrally or best way send it to main activity with intent and use it there. 即在后期执行中,您完成了当前活动,而该片段在主活动中,因此列表为空。因此,如果是这种情况(请更正我的意思),然后将数据集中下载或以最佳方式发送有意图地进行主要活动并在那里使用它。 Also when running from android studio kill the app manually and run it again,while the phone is connected and see if it crashes in current scenario. 另外,当从android studio运行时,请手动杀死该应用程序并再次运行,同时手机已连接并查看它在当前情况下是否崩溃。

Send your data from doInBackground to MainActivity with sendBroadcast 使用sendBroadcast将数据从doInBackground发送到MainActivity

Add broadcast method in DownloadData class DownloadData类中添加广播方法
private void broadcast(SplashParcel parcel) {
    Intent i = new Intent("splash_parcel");
    i.putExtra("values", parcel);
    sendBroadcast(i);
}

@Override
protected String doInBackground(String... params) {
    // your code
    // ..
    try {
        // your code
        // ..


        // send splashParcel to MainActivity
        SplashParcel splashParcel = new SplashParcel(feedList, eventList, todayList, upcomingList, partnerList);
        broadcast (splashParcel);   

    } catch (JSONException e) {
        e.printStackTrace();
    }
    return JSON_STRING;
}
Add new class SplashParcel.java 添加新的类SplashParcel.java
 public class SplashParcel implements Parcelable { public static final Creator<SplashParcel> CREATOR = new Creator<SplashParcel>() { @Override public SplashParcel createFromParcel(Parcel in) { return new SplashParcel(in); } @Override public SplashParcel[] newArray(int size) { return new SplashParcel[size]; } }; private static List<Feed> _feedList; private static List<Event> _eventList; private static List<Event> _todayList; private static List<Event> _upcomingList; private static List<Partner> _partnerList; protected SplashParcel(Parcel in) { _feedList = new ArrayList<Feed>(); in.readList(_feedList, null); _eventList = new ArrayList<Event>(); in.readList(_eventList, null); _todayList = new ArrayList<Event>(); in.readList(_todayList, null); _upcomingList = new ArrayList<Event>(); in.readList(_upcomingList, null); _partnerList = new ArrayList<Partner>(); in.readList(_partnerList, null); } public SplashParcel(List<Feed> feedList, List<Event> eventList, List<Event> todayList, List<Event> upcomingList, List<Partner> partnerList) { _feedList = feedList; _eventList = eventList; _todayList = todayList; _upcomingList = upcomingList; _partnerList = partnerList; } public SplashParcel() { } public List<Feed> getFeedList() { return _feedList; } public void setFeedList(List<Feed> feedList) { _feedList = feedList; } public List<Event> getEventList() { return _eventList; } public void setEventList(List<Event> eventList) { _eventList = eventList; } public List<Event> getTodayList() { return _todayList; } public void setTodayList(List<Event> todayList) { _todayList = todayList; } public List<Event> getUpcomingList() { return _upcomingList; } public void setUpcomingList(List<Event> upcomingList) { _upcomingList = upcomingList; } public List<Partner> getPartnerList() { return _partnerList; } public void setPartnerList(List<Partner> partnerList) { _partnerList = partnerList; } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel parcel, int i) { parcel.writeList(_feedList); parcel.writeList(_eventList); parcel.writeList(_todayList); parcel.writeList(_upcomingList); parcel.writeList(_partnerList); } } 
MainActivity.java MainActivity.java
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    SplashParcel splashParcel = getArguments().getParcelable("splash_parcel");  
    if(splashParcel != null) {  
        // your splashParcel ready in here
        List<Feed> feedList = splashParcel.getFeedList()
        List<Event> eventList = splashParcel.getEventList()
        List<Event> todayList = splashParcel.getTodayList();
        List<Event> upcommingList = splashParcel.getUpcomingList();
        List<Partner> partnerList = splashParcel.getPartnerList();
    }
}
In onCreateView of DiscoverFragment : DiscoverFragment的 onCreateView中:
 @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { SplashParcel splashParcel = getArguments().getParcelable("splash_parcel"); if(splashParcel != null) { // your splashParcel ready in here List<Feed> feedList = splashParcel.getFeedList() List<Event> eventList = splashParcel.getEventList() List<Event> todayList = splashParcel.getTodayList(); List<Event> upcommingList = splashParcel.getUpcomingList(); List<Partner> partnerList = splashParcel.getPartnerList(); } } 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM