我有一个WebView,当视图可以返回时双击后退按钮会崩溃。会发生什么,是在第一次Back按下时,它会导致页面返回(导致上一页的加载(页面A)。然后第二个onKeyDown事件到来并杀死WebView(如预期的那样)。问题是在WebView被杀之后,页面A继续加载(由于第一次按下Back按钮),并且调用了onPageStarted和onPageFinished。这些函数使应用程序崩溃,因为webView已经被破坏。我该怎么办?
use std::boxed::Box;
use std::collections::HashMap;
use std::fmt;
pub type TileMap = HashMap<(i32, i32), Box<Tile>>;
pub trait Tile: fmt::Debug {
fn new(x: i32, y: i32) -> Self where Self: Sized;
fn update_into(&self, app: &App, new_tiles: &mut TileMap);
}
#[derive(Copy, Clone, Debug)]
pub struct DirtTile {
pub x: i32,
pub y: i32
}
impl Tile for DirtTile {
fn new(x: i32, y: i32) -> DirtTile {
return DirtTile { x: x, y: y };
}
fn update_into(&self, app: &App, new_tiles: &mut TileMap) {
let world = &app.world;
let new_pos = (self.x + 1, self.y);
if world.tiles.get(&new_pos).is_none() {
new_tiles.insert(new_pos, Box::new(DirtTile::new(self.x + 1, self.y)));
}
else {
new_tiles.insert((self.x, self.y), Box::new(*self));
}
}
}
pub struct World {
tiles: TileMap,
}
pub struct App {
world: World,
}
fn main() {
let mut app = App { world: World { tiles: HashMap::new() } };
app.world.tiles.insert((0, 0), Box::new(DirtTile::new(0, 0)));
let mut new_tiles = HashMap::new();
for (_, tile) in &app.world.tiles {
tile.update_into(&app, &mut new_tiles);
}
app.world.tiles = new_tiles;
println!("{:?}", app.world.tiles);
}
答案 0 :(得分:0)
@Override
public boolean onKeyDown(int keycode, KeyEvent event) {
if (event.getAction() == KeyEvent.ACTION_DOWN) {
switch (keycode) {
case KeyEvent.KEYCODE_BACK:
if (view.canGoBack()) {
view.goBack();
} else {
finish();
}
return true;
}
}
return super.onKeyDown(keycode, event);
}
}
这在我的情况下工作添加'return true;'在案例中的陈述......
答案 1 :(得分:0)
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
try{
//your code here
}
catch (Exception e){
}
}
@Override
public void onPageFinished(WebView view, String url) {
try{
//your code here
}
catch (Exception e){
}
}
这对我有用。使用try catch in onPageStarted()和onPageFinished()。 我认为这也对您有效,请尝试一下。