WebView 空引用
WebView null reference
我的 android 应用程序中的推送通知栏有问题...当用户尝试按下按钮时,我的应用程序崩溃并抛出空对象引用错误:
E/AndroidRuntime:致命异常:IntentService[NotificationActionService]
进程:tk.ypod.ypod,PID:24013
java.lang.NullPointerException: 尝试在空对象引用
上调用虚拟方法'android.view.View android.view.View.findViewById(int)'
我试图修复这个错误几个小时但没有成功,所以现在我向你寻求帮助。
我的代码:
package tk.ypod.ypod;
import android.app.IntentService;
import android.content.Intent;
import android.media.MediaPlayer;
import android.util.Log;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
public class NotificationActionService extends IntentService {
static final String LOG_TAG = MainActivity.class.getSimpleName();
private MediaPlayer mp;
private WebView webview;
public NotificationActionService() {
super( "NotificationActionService" );
}
@Override
protected void onHandleIntent(Intent intent) {
webview = webview.findViewById(R.id.activity_notification_webview);
webview.setWebChromeClient( new WebChromeClient() );
webview.setWebViewClient(new WebClient() {
});
String action = intent.getAction();
Log.e( LOG_TAG, "Received notification action: " + action );
if ("Previous".equals( action )) {
webview.loadUrl( "javascript: previous();" );
} else if ("Next".equals( action )) {
webview.loadUrl( "javascript: next();" );
} else if ("Stop".equals( action )) {
if (mp.isPlaying()) {
webview.loadUrl( "javascript: stopVideo();" );
mp.stop();
}
} else if ("Play".equals( action )) {
if (mp.isPlaying()) {
webview.loadUrl( "javascript: playVideo();" );
mp.start();
}
}
}
}
我的清单
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="tk.ypod.ypod" >
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<application
android:allowBackup="true"
android:label="yPOD"
android:hardwareAccelerated="true"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen" >
<activity
android:name="tk.ypod.ypod.MainActivity"
android:label="yPOD" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service android:name=".NotificationActionService" />
</application>
编辑,创建通知:
意图
Intent intent = new Intent(MainActivity.this, MainActivity.class);
intent.putExtra("Next",true);
PendingIntent nextIntent = PendingIntent.getActivity(MainActivity.this, 1, intent, 0);
正在检查 onCreate()
boolean nextFlag = getIntent().getBooleanExtra("Next",false);
if(nextFlag) {
webview.evaluateJavascript( "javascript:next()",
new ValueCallback <String>() {
@Override
public void onReceiveValue(String value) {
Log.e( LOG_TAG, "Next workded " + value );
}
}
);
}
我不确定你想要达到什么目的,但我确信你的方法需要改进
首先空指针是因为,你还没有初始化WebView,但你调用了以下:
webview = webview.findViewById(R.id.activity_notification_webview)
其次,您正在从 IntentService 执行 UI 操作(在您的情况下使用 WebView),由于 IntentService 在工作线程中运行,因此无法正常工作。
我建议您将处理 WebView 的代码移动到 Activity 或 Fragment。
当您使用服务时,您无权访问视图(通常在活动或片段中使用),您需要使用广播接收器或待定意图才能从您的服务发送数据对于 activity,您的 activity 将相应地读取数据和 load/change 视图。
E/AndroidRuntime: FATAL EXCEPTION:
IntentService[NotificationActionService] Process: tk.ypod.ypod, PID:
24013 java.lang.NullPointerException: Attempt to invoke virtual method
'android.view.View android.view.View.findViewById(int)' on a null
object reference
错误是因为您试图从 Service
访问 UI 组件,但这是不可能的。您应该将上述代码托管在 Activity
中,并使用 LocalBroadcastmanager
或 Messenger
.
从您的 Service
与其通信
我的 android 应用程序中的推送通知栏有问题...当用户尝试按下按钮时,我的应用程序崩溃并抛出空对象引用错误:
E/AndroidRuntime:致命异常:IntentService[NotificationActionService] 进程:tk.ypod.ypod,PID:24013 java.lang.NullPointerException: 尝试在空对象引用
上调用虚拟方法'android.view.View android.view.View.findViewById(int)'我试图修复这个错误几个小时但没有成功,所以现在我向你寻求帮助。
我的代码:
package tk.ypod.ypod;
import android.app.IntentService;
import android.content.Intent;
import android.media.MediaPlayer;
import android.util.Log;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
public class NotificationActionService extends IntentService {
static final String LOG_TAG = MainActivity.class.getSimpleName();
private MediaPlayer mp;
private WebView webview;
public NotificationActionService() {
super( "NotificationActionService" );
}
@Override
protected void onHandleIntent(Intent intent) {
webview = webview.findViewById(R.id.activity_notification_webview);
webview.setWebChromeClient( new WebChromeClient() );
webview.setWebViewClient(new WebClient() {
});
String action = intent.getAction();
Log.e( LOG_TAG, "Received notification action: " + action );
if ("Previous".equals( action )) {
webview.loadUrl( "javascript: previous();" );
} else if ("Next".equals( action )) {
webview.loadUrl( "javascript: next();" );
} else if ("Stop".equals( action )) {
if (mp.isPlaying()) {
webview.loadUrl( "javascript: stopVideo();" );
mp.stop();
}
} else if ("Play".equals( action )) {
if (mp.isPlaying()) {
webview.loadUrl( "javascript: playVideo();" );
mp.start();
}
}
}
}
我的清单
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="tk.ypod.ypod" >
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<application
android:allowBackup="true"
android:label="yPOD"
android:hardwareAccelerated="true"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen" >
<activity
android:name="tk.ypod.ypod.MainActivity"
android:label="yPOD" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service android:name=".NotificationActionService" />
</application>
编辑,创建通知: 意图
Intent intent = new Intent(MainActivity.this, MainActivity.class);
intent.putExtra("Next",true);
PendingIntent nextIntent = PendingIntent.getActivity(MainActivity.this, 1, intent, 0);
正在检查 onCreate()
boolean nextFlag = getIntent().getBooleanExtra("Next",false);
if(nextFlag) {
webview.evaluateJavascript( "javascript:next()",
new ValueCallback <String>() {
@Override
public void onReceiveValue(String value) {
Log.e( LOG_TAG, "Next workded " + value );
}
}
);
}
我不确定你想要达到什么目的,但我确信你的方法需要改进
首先空指针是因为,你还没有初始化WebView,但你调用了以下:
webview = webview.findViewById(R.id.activity_notification_webview)
其次,您正在从 IntentService 执行 UI 操作(在您的情况下使用 WebView),由于 IntentService 在工作线程中运行,因此无法正常工作。
我建议您将处理 WebView 的代码移动到 Activity 或 Fragment。
当您使用服务时,您无权访问视图(通常在活动或片段中使用),您需要使用广播接收器或待定意图才能从您的服务发送数据对于 activity,您的 activity 将相应地读取数据和 load/change 视图。
E/AndroidRuntime: FATAL EXCEPTION: IntentService[NotificationActionService] Process: tk.ypod.ypod, PID: 24013 java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.view.View.findViewById(int)' on a null object reference
错误是因为您试图从 Service
访问 UI 组件,但这是不可能的。您应该将上述代码托管在 Activity
中,并使用 LocalBroadcastmanager
或 Messenger
.
Service
与其通信