【问题标题】:Splash Screen using AsyncTask使用 AsyncTask 的启动画面
【发布时间】:2017-01-28 17:53:23
【问题描述】:

我有一个使用AsyncTask 的启动画面,它会从数据库中下载一些数据并将数据存储在ArrayList 中。这个ArrayList 将在MainActivity.class 的片段中用于RecyclerView

问题是,当我将应用程序从 Android Studio 运行到手机时,一切正常。但是,当我销毁该应用程序并从我的手机手动运行它时,它会显示空白屏幕,然后它会崩溃。如果我在它崩溃后再次运行,该应用程序将运行。所以,这个应用程序只有在我从 Android Studio 运行它或在它崩溃后才能运行。

错误说它是由空列表引起的。如果我没记错的话,我认为AsyncTask 在活动被销毁后似乎无法正常工作。但我不知道如何解决它。请帮我解决这个问题。

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

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

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)

【问题讨论】:

  • 不要使用静态列表,通过parcelables发送应该可以解决您的问题。

标签: java android android-asynctask


【解决方案1】:

feedList 为空。您在执行 DownloadData 任务时创建 feedList 实例。但是当应该创建片段视图时,您在addBottomDots 中调用feedList.size()。因此,很可能在执行DownloadData 任务之前调用了addBottomDots。你需要修复它。

【讨论】:

    【解决方案2】:

    您的发现片段中的提要列表在初始化时变空。请在执行此操作之前设置一个空检查。这与从 android studio 运行无关。如果我理解正确,您将在完成后尝试从 splaScreen 活动访问列表。即在执行后您完成当前活动并且片段处于主要活动中,因此列表将变为空。因此,如果是这种情况(如果不是,请纠正我)然后集中下载数据或最好的方式发送它有意图的主要活动并在那里使用它。此外,当从 android studio 运行时,手动终止应用程序并再次运行它,同时连接手机并查看它是否在当前场景下崩溃。

    【讨论】:

      【解决方案3】:

      使用 sendBroadcast

      将您的数据从 doInBackground 发送到 MainActivity 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;
      }
      
      添加新类 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
      // member variable
      private BroadcastReceiver _splashReceiver;
      private Bundle _bundle = new Bundle();
      
      
      @Override
      protected void onResume() {
          super.onResume();
      
          splashReceiver();
      }
      
      // receive splashParcel from SplashScreenActivity
      private void splashReceiver() {
          if (_splashReceiver == null) {
              _splashReceiver = new BroadcastReceiver() {
                  @Override
                  public void onReceive(Context context, Intent intent) {
      
                      SplashParcel splashParcel = intent.getParcelableExtra("values");
                      if (splashParcel != null) {
                          // save splashParcel into _budle
                          _bundle.putParcelable("splash_parcel", splashParcel);
                      }
                  }
              };
              registerReceiver(_splashReceiver, new IntentFilter("splash_parcel"));
          }
      }
      
      //Send _bundle to DiscoverFragment
      private void showDiscoverFragment(){
          if(_bundle != null) {
              // create instance of discoverFragment with passing _bundle as arguments
              DiscoverFragment discoverFragment = new DiscoverFragment();
              discoverFragment.setArguments(_bundle);
      
              // replace activity_main.xml with discoverFragment
              getSupportFragmentManager().beginTransaction().replace(R.id.main_container, discoverFragment).addBackStack(null).commit();
          }
      }
      
      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();
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多