android-onKeyDown() 不能在继承类上运行

问题描述

onKeyDown() 不能在继承类上运行

我创建了一个自定义 GalleryView,在 Samsung Galaxy S III 或者 Nexus 4 上都可以执行。当我在模拟器中运行的时候,出现下面的错误:

02-24 01:01:03.593: E/AndroidRuntime(3429): FATAL EXCEPTION: Thread-11
02-24 01:01:03.593: E/AndroidRuntime(3429): android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
02-24 01:01:03.593: E/AndroidRuntime(3429):     at android.view.ViewRoot.checkThread(ViewRoot.java:2802)
02-24 01:01:03.593: E/AndroidRuntime(3429):     at android.view.ViewRoot.playSoundEffect(ViewRoot.java:2581)
02-24 01:01:03.593: E/AndroidRuntime(3429):     at android.view.View.playSoundEffect(View.java:8516)
02-24 01:01:03.593: E/AndroidRuntime(3429):     at android.widget.Gallery.onKeyDown(Gallery.java:1109)
02-24 01:01:03.593: E/AndroidRuntime(3429):     at com.example.coverflow.ui.galleryView$1.run(galleryView.java:55)
02-24 01:01:03.593: E/AndroidRuntime(3429):     at java.lang.Thread.run(Thread.java:1096)

这些错误涉及到下面的代码:

public void startSlideShow(final int periodTime)
{
    final Runnable __runnable = new Runnable()
    {
        @Override
        public void run()
        {
            if (!isTouched)
                galleryView.this.onKeyDown(KeyEvent.KEYCODE_DPAD_RIGHT, null);
            mHandler.postDelayed(this, periodTime);
        }
    };
    new Thread(__runnable).start();

    this.setOnTouchListener(new View.OnTouchListener()
    {
        @Override
        public boolean onTouch(View view, MotionEvent event)
        {
            int currentEvent = event.getAction();
            if (currentEvent == MotionEvent.ACTION_DOWN
                    || currentEvent == MotionEvent.ACTION_MOVE)
                isTouched = true;
            else
            {
                isTouched = false;
                // Reset handler
                mHandler.removeCallbacks(__runnable);
                mHandler.postDelayed(__runnable, periodTime);
            }
            return false;
        }
    });
}

如何处理这个问题?

Line 55 是galleryView.this.onKeyDown(KeyEvent.KEYCODE_DPAD_RIGHT, null);

解决方案

 galleryView.this.onKeyDown(KeyEvent.KEYCODE_DPAD_RIGHT, null);

你这一句是在你自己new的thread里面执行的。所以会报错。

mHandler.post(__runnable);
new Thread(__runnable).start();

这个不需要

解决方案二:

你可以从其他线程中更新 UI,而不是activity UI 线程。
就比如错误提示:

Only the original thread that created a view hierarchy can touch its views.

使用 runOnUIThread(new Runnable{ ... }()) 将文件访问代码打包

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;
public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    MainActivity.this.runOnUiThread(new Runnable() {
         public void run() {
            Toast.makeText(MainActivity.this, "This is Toast!!!", Toast.LENGTH_SHORT).show();
    }
    });
}
}
时间: 2024-10-29 22:56:02

android-onKeyDown() 不能在继承类上运行的相关文章

android-关于Android部分代码能在模拟器上运行,但在手机上出错

问题描述 关于Android部分代码能在模拟器上运行,但在手机上出错 最近在写一个APP,但部分代码能在模拟器上运行,却不能在真机上运行,直接抛出异常,而且是个十分简单的代码.代码如下: Runnable updateThread = new Runnable(){ //将要执行的操作写在线程对象的run方法当中 public void run(){ try{ byte[] bytes1 = Autils.download(url); System.out.println("--0--"

谷歌高管确认 Android 应用可在 Chrome OS 上运行

在前天进行的I/O开发者大会其中一场Session中,Google高管确认未来所有你所喜欢的Android应用都能在Chrome OS上运行,这也预示着未来Chrome OS会迎来更好的硬件配置,从逻辑上这意味着在未来某天Chromebook具备比肩MacBook和中端Windows设备的硬件规格,装备更好的处理器.更大容量的内存和储存空间. 在规格上,很多顶级Android设备已经能够妥善的完成Chromebook的各项任务,伴随着过去几年Chrome OS日益受到消费者的认可,毋庸置疑这将会

android 4 0-关于JNI,为什么在android 4.4运行正常的程序,在4.0上运行就报错了

问题描述 关于JNI,为什么在android 4.4运行正常的程序,在4.0上运行就报错了 事情是这样的: 本身项目是基于android 4.4.2.JDK1.7 编译的,然后公司要求最低版本. 然后我将项目改成了android 2.3.3.JDK1.6编译,修改一些内容后,编译通过,在android 4.4.2的手机上运行正常. 但是现在市场部反应,在低于4.1.X的版本上运行还是有问题,因此我找来一台android 4.0.4内核的手机调试,确实报错了,在JNI模块. 报:Unsatisfi

使用 ARChon 运行时环境在 Ubuntu 上运行 Android 应用

在此之前,我们尝试过在多款安卓应用模拟器工具上运行安卓应用,比如Genymotion.VirtualBox和Android SDK等.但是,有了这套全新的Chrome安卓运行环境,就可以在Chrome浏览器中运行安卓应用了.所以,下面是一些步骤来指导你如何使用ARChon运行时环境在Ubuntu上安装安卓应用. 谷歌已经公布了首批支持原生运行在Chrome OS的安卓应用,而这个全新的"安卓运行时环境"扩展程序使其成为可能.如今,一位名为Vlad Filippov的开发者已经找到了一种

编译可在Android上运行的依赖库(一):glib库

编译可在Android上运行的依赖库(一):glib库 作者:寻禹@阿里聚安全 前言 这是系列文章,它们由<编译可在Android上运行的glib库>及其他4篇文章组成,这4篇文章在"编译依赖库"一节中列出.由于glib库依赖于其他第三方库,所以需要先将依赖的第三方库交叉编译到Android平台上才能成功的编译glib库,系列文章中除<编译可在Android上运行的glib库>外的其他交叉编译文章均是介绍如何对glib依赖库进行交叉编译.以上,所以叫系列文章,因

在指定的数据库上运行SQL语句的类

数据|数据库|语句 <% '在指定的数据库上运行SQL语句的类'使用方法:'dim runs'set runs=new runsql'runs.setdbn=数据库名'if runs.ifok then' response.write runs.errs' response.end'end if'runs.setsql=sql'runs.run'if runs.ifok then' response.write runs.errs' response.end'else' response.wri

在PC上运行Android游戏

自从运行谷歌 Android 系统的手机大行其道之后,不少朋友都幻想过在普通的 PC 电脑,或者说 Windows 系统上运行 Android 操作系统,虽然有不少软件都号称可以做到运行 Android 系统的效果,不过期流畅度和实用度就真的不敢恭维. 最近,一款备受关注的软件--BlueStacks App Player,号称可以在任何设备上流畅运行 Android 程序,到底这款 BlueStacks App Player 能不能让我们的 PC 机吃上 Android 的"冰淇淋"

视频-android项目在4.4上运行正常,在5.0以上运行时出现问题

问题描述 android项目在4.4上运行正常,在5.0以上运行时出现问题 我项目在4.4上运行正常,但在5.0项目上运行时,有个视频界面放置一段时间不对其做任何操作,这个界面会出现黑屏的状况. 解决方案 把编译时出现的警告完善.确保Java每一步都实现 解决方案二: 你提供的信息太少,可以尝试在黑屏左右的时间抓下log,看log里有什么打印,然后工程用android21的sdk,确保没有过时的接口调用

编译可在Android上运行的qemu user mode

编译可在Android上运行的qemu user mode 寻禹@阿里聚安全 前言 本文在Ubuntu 64位系统上对qemu项目进行交叉编译,并且只编译与qemu user mode有关的代码. 下文中的"NDK"若无特殊说明均指"Android NDK". 下文中"$NDK"表示的是NDK的根目录. 步骤 1. 下载并安装Android NDK 下载并安装Android NDK的过程在这里不做介绍. 2. 下载qemu 3. 设置NDK工具的