草庐IT

android - 异常调度输入事件和 SwipeRefreshLayout 下拉空指针异常

coder 2023-12-29 原文

我有一个滑动来刷新布局(android.support.v4 修订版 19.1 的一部分),当我在布局上向下滑动时,我可以到达顶部已满的位置,但进一步向下滑动会导致应用程序崩溃,logcat 指向我的代码中没有特定的行。由于 SwipeRefreshLayout 只有几个月大,因此互联网上没有很多信息可以帮助我找出问题所在。在我无法将支持 v4 修订版 19.1 添加到我的构建路径之前,但我很确定我已修复该问题。这是 logcat,以及布局文件和我的 SwipeRefreshLayout 的代码。以及应用程序崩溃时的屏幕截图。

06-18 23:09:31.527: E/InputEventReceiver(25459): Exception dispatching input event.
06-18 23:09:31.547: E/AndroidRuntime(25459): FATAL EXCEPTION: main
06-18 23:09:31.547: E/AndroidRuntime(25459): Process: com.bernard.beaconportal, PID: 25459
06-18 23:09:31.547: E/AndroidRuntime(25459): java.lang.NullPointerException
06-18 23:09:31.547: E/AndroidRuntime(25459):    at android.support.v4.widget.SwipeRefreshLayout.startRefresh(SwipeRefreshLayout.java:441)
06-18 23:09:31.547: E/AndroidRuntime(25459):    at android.support.v4.widget.SwipeRefreshLayout.onTouchEvent(SwipeRefreshLayout.java:399)
06-18 23:09:31.547: E/AndroidRuntime(25459):    at android.view.View.dispatchTouchEvent(View.java:7706)
06-18 23:09:31.547: E/AndroidRuntime(25459):    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2210)
06-18 23:09:31.547: E/AndroidRuntime(25459):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1945)
06-18 23:09:31.547: E/AndroidRuntime(25459):    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
06-18 23:09:31.547: E/AndroidRuntime(25459):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
06-18 23:09:31.547: E/AndroidRuntime(25459):    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
06-18 23:09:31.547: E/AndroidRuntime(25459):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
06-18 23:09:31.547: E/AndroidRuntime(25459):    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
06-18 23:09:31.547: E/AndroidRuntime(25459):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
06-18 23:09:31.547: E/AndroidRuntime(25459):    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
06-18 23:09:31.547: E/AndroidRuntime(25459):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
06-18 23:09:31.547: E/AndroidRuntime(25459):    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
06-18 23:09:31.547: E/AndroidRuntime(25459):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
06-18 23:09:31.547: E/AndroidRuntime(25459):    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
06-18 23:09:31.547: E/AndroidRuntime(25459):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
06-18 23:09:31.547: E/AndroidRuntime(25459):    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
06-18 23:09:31.547: E/AndroidRuntime(25459):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
06-18 23:09:31.547: E/AndroidRuntime(25459):    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
06-18 23:09:31.547: E/AndroidRuntime(25459):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
06-18 23:09:31.547: E/AndroidRuntime(25459):    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
06-18 23:09:31.547: E/AndroidRuntime(25459):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
06-18 23:09:31.547: E/AndroidRuntime(25459):    at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2339)
06-18 23:09:31.547: E/AndroidRuntime(25459):    at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1569)
06-18 23:09:31.547: E/AndroidRuntime(25459):    at android.app.Activity.dispatchTouchEvent(Activity.java:2492)
06-18 23:09:31.547: E/AndroidRuntime(25459):    at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2286)
06-18 23:09:31.547: E/AndroidRuntime(25459):    at android.view.View.dispatchPointerEvent(View.java:7886)
06-18 23:09:31.547: E/AndroidRuntime(25459):    at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:3947)
06-18 23:09:31.547: E/AndroidRuntime(25459):    at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:3826)
06-18 23:09:31.547: E/AndroidRuntime(25459):    at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3392)
06-18 23:09:31.547: E/AndroidRuntime(25459):    at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3442)
06-18 23:09:31.547: E/AndroidRuntime(25459):    at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3411)
06-18 23:09:31.547: E/AndroidRuntime(25459):    at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3518)
06-18 23:09:31.547: E/AndroidRuntime(25459):    at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3419)
06-18 23:09:31.547: E/AndroidRuntime(25459):    at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3575)
06-18 23:09:31.547: E/AndroidRuntime(25459):    at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3392)
06-18 23:09:31.547: E/AndroidRuntime(25459):    at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3442)
06-18 23:09:31.547: E/AndroidRuntime(25459):    at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3411)
06-18 23:09:31.547: E/AndroidRuntime(25459):    at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3419)
06-18 23:09:31.547: E/AndroidRuntime(25459):    at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3392)
06-18 23:09:31.547: E/AndroidRuntime(25459):    at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:5532)
06-18 23:09:31.547: E/AndroidRuntime(25459):    at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:5512)
06-18 23:09:31.547: E/AndroidRuntime(25459):    at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:5483)
06-18 23:09:31.547: E/AndroidRuntime(25459):    at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:5612)
06-18 23:09:31.547: E/AndroidRuntime(25459):    at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185)
06-18 23:09:31.547: E/AndroidRuntime(25459):    at android.view.InputEventReceiver.nativeConsumeBatchedInputEvents(Native Method)
06-18 23:09:31.547: E/AndroidRuntime(25459):    at android.view.InputEventReceiver.consumeBatchedInputEvents(InputEventReceiver.java:176)
06-18 23:09:31.547: E/AndroidRuntime(25459):    at android.view.ViewRootImpl.doConsumeBatchedInput(ViewRootImpl.java:5585)
06-18 23:09:31.547: E/AndroidRuntime(25459):    at android.view.ViewRootImpl$ConsumeBatchedInputRunnable.run(ViewRootImpl.java:5631)
06-18 23:09:31.547: E/AndroidRuntime(25459):    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761)
06-18 23:09:31.547: E/AndroidRuntime(25459):    at android.view.Choreographer.doCa

这是布局

<android.support.v4.widget.SwipeRefreshLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="#ffffff"
    android:id="@+id/swipe" >

    <ListView
        android:id="@+id/listView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
         android:background="#ffffff">

    </ListView>
</android.support.v4.widget.SwipeRefreshLayout>

这是处理 SwipeRefreshLayout 的代码

SwipeRefreshLayout swipeLayout; 


    public static final String KEY_HOMEWORK="homework";
    public static final String KEY_DESC="desc";

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


         View swipe = inflater.inflate(R.layout.activity_main, container, false); 

         swipeLayout = (SwipeRefreshLayout) swipe.findViewById(R.id.swipe);

         swipeLayout.setEnabled(false);

    ListView lView = (ListView) swipe.findViewById(R.id.listView1);

    lView.setOnScrollListener(new AbsListView.OnScrollListener() {
        @Override
        public void onScrollStateChanged(AbsListView absListView, int i) {

        }

        @Override
        public void onScroll(AbsListView absListView, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
                if (firstVisibleItem == 0)
                    swipeLayout.setEnabled(true);
                else
                    swipeLayout.setEnabled(false);
        }
    });


    return swipe;

    }

这是它崩溃的屏幕截图,你可以看到它一直向下滑动,通常它会在此时触发一些东西。但随后它崩溃了。

最佳答案

您的 OnRefreshListener 为 null,要么您没有设置,要么在您的代码的某个位置将其设置为 null。

SwipeRefreshLayout 的源代码中,特别是在这个 fragment 中

 private void startRefresh() {
        removeCallbacks(mCancel);
        mReturnToStartPosition.run();
        setRefreshing(true);
        mListener.onRefresh();
    }

在第 441 行,mListener.onRefresh(); 引发了 NullPointerException

关于android - 异常调度输入事件和 SwipeRefreshLayout 下拉空指针异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24298214/

有关android - 异常调度输入事件和 SwipeRefreshLayout 下拉空指针异常的更多相关文章

  1. ruby-on-rails - Rails - 乐观锁定总是触发 StaleObjectError 异常 - 2

    我正在学习Rails,并阅读了关于乐观锁的内容。我已将类型为integer的lock_version列添加到我的articles表中。但现在每当我第一次尝试更新记录时,我都会收到StaleObjectError异常。这是我的迁移:classAddLockVersionToArticle当我尝试通过Rails控制台更新文章时:article=Article.first=>#我这样做:article.title="newtitle"article.save我明白了:(0.3ms)begintransaction(0.3ms)UPDATE"articles"SET"title"='dwdwd

  2. ruby - #之间? Cooper 的 *Beginning Ruby* 中的错误或异常 - 2

    在Cooper的书BeginningRuby中,第166页有一个我无法重现的示例。classSongincludeComparableattr_accessor:lengthdef(other)@lengthother.lengthenddefinitialize(song_name,length)@song_name=song_name@length=lengthendenda=Song.new('Rockaroundtheclock',143)b=Song.new('BohemianRhapsody',544)c=Song.new('MinuteWaltz',60)a.betwee

  3. ruby - 在 Ruby 中重新分配常量时抛出异常? - 2

    我早就知道Ruby中的“常量”(即大写的变量名)不是真正常量。与其他编程语言一样,对对象的引用是唯一存储在变量/常量中的东西。(侧边栏:Ruby确实具有“卡住”引用对象不被修改的功能,据我所知,许多其他语言都没有提供这种功能。)所以这是我的问题:当您将一个值重新分配给常量时,您会收到如下警告:>>FOO='bar'=>"bar">>FOO='baz'(irb):2:warning:alreadyinitializedconstantFOO=>"baz"有没有办法强制Ruby抛出异常而不是打印警告?很难弄清楚为什么有时会发生重新分配。 最佳答案

  4. ruby-on-rails - 事件管理员日期过滤器日期格式自定义 - 2

    是否有简单的方法来更改默认ISO格式(yyyy-mm-dd)的ActiveAdmin日期过滤器显示格式? 最佳答案 您可以像这样为日期选择器提供额外的选项,而不是覆盖js:=f.input:my_date,as::datepicker,datepicker_options:{dateFormat:"mm/dd/yy"} 关于ruby-on-rails-事件管理员日期过滤器日期格式自定义,我们在StackOverflow上找到一个类似的问题: https://s

  5. SPI接收数据异常问题总结 - 2

    SPI接收数据左移一位问题目录SPI接收数据左移一位问题一、问题描述二、问题分析三、探究原理四、经验总结最近在工作在学习调试SPI的过程中遇到一个问题——接收数据整体向左移了一位(1bit)。SPI数据收发是数据交换,因此接收数据时从第二个字节开始才是有效数据,也就是数据整体向右移一个字节(1byte)。请教前辈之后也没有得到解决,通过在网上查阅前人经验终于解决问题,所以写一个避坑经验总结。实际背景:MCU与一款芯片使用spi通信,MCU作为主机,芯片作为从机。这款芯片采用的是它规定的六线SPI,多了两根线:RDY和INT,这样从机就可以主动请求主机给主机发送数据了。一、问题描述根据从机芯片手

  6. 安卓apk修改(Android反编译apk) - 2

    最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路

  7. ruby-on-rails - 事件记录 : Select max of limit - 2

    我正在尝试将以下SQL查询转换为ActiveRecord,它正在融化我的大脑。deletefromtablewhereid有什么想法吗?我想做的是限制表中的行数。所以,我想删除少于最近10个条目的所有内容。编辑:通过结合以下几个答案找到了解决方案。Temperature.where('id这给我留下了最新的10个条目。 最佳答案 从您的SQL来看,您似乎想要从表中删除前10条记录。我相信到目前为止的大多数答案都会如此。这里有两个额外的选择:基于MurifoX的版本:Table.where(:id=>Table.order(:id).

  8. ruby-on-rails - 事件管理员和自定义方法 - 2

    这是我在ActiveAdmin中的自定义页面ActiveAdmin.register_page"Settings"doaction_itemdolink_to('Importprojects','settings/importprojects')endcontentdopara"Text"endcontrollerdodefimportprojectssystem"rakedataspider:import_projects_ninja"para"OK"endendend我想做的是,当我单击“导入项目”按钮时,我想在Controller中执行rake任务。但是我无法访问该方法。可能是什

  9. ruby-on-rails - ActiveAdmin 自定义选择过滤器下拉名称 - 2

    对于用户模型,我有一个过滤器来检查用户的预订状态,该状态由整数值(0、1或2)表示。UserActiveAdmin索引页上的过滤器是通过以下代码实现的:filter:booking_status,as::select然而,这会导致下拉选项为0、1或2。当管理员用户从下拉列表中选择它们时,我更愿意自己将它们命名为“未完成”、“待定”和“已确认”之类的名称。有没有办法在不改变booking_status在模型中的表示方式的情况下做到这一点? 最佳答案 假设booking_status是模型中的枚举字段,您可以使用:过滤器:booking

  10. ruby - 如何捕获 ruby​​ 中的所有异常? - 2

    我们如何捕获或/和处理ruby​​中所有未处理的异常?例如,这样做的动机可能是将某种异常记录到不同的文件或发送电子邮件给系统管理。在Java中我们会做Thread.setDefaultUncaughtExceptionHandler(UncaughtExceptionHandlerex);在Node.js中process.on('uncaughtException',function(error){/*code*/});在PHP中register_shutdown_function('errorHandler');functionerrorHandler(){$error=error_

随机推荐