【发布时间】:2015-01-11 16:42:40
【问题描述】:
在我将 AltBeacons RangeNotifier 设置为我的活动后,我在加载 URL (WebView.loadUrl) 时遇到问题。当我不激活 RangeNotifier 时,我的 WebView 会按应有的方式处理每个 URL。但是当我开始监听周围的信标时,我的 web 视图中的每个 loadUrl 调用都没有结束,我只看到一个白页。
我认为,这在某种程度上是不同线程的问题,它们尝试使用 webview...
Android 5.+ 中不会出现此问题。
谁能帮帮我?有人有同样的问题吗?
编辑: 非常感谢您的回答大卫。但不幸的是,这似乎并不能解决问题。
以下活动在我的 Android 4.4.4 的 Nexus 7 上不起作用(webview 永远不会停止加载!只是有时会开始加载,但永远不会结束)。我刚刚删除了所有代码,这与这里无关(这就是为什么有些方法似乎有点不必要)。
我注意到,我收到了一个 FBIOGET_FSCREENINFO 失败错误。有一次,它工作得很好(但不是我试过的其他 100 次:-/)
编辑 2:我更新了我的代码,因此我的 webview 确实应该有足够的时间来加载 url。我现在每次都加载不同的 URL。当我打开 Chrome 并在平板电脑上加载相同的 URL 时,它们的加载速度非常快(正如 WIFI 预期的那样)。我注意到,我收到了“本机绘制警告”。我真的不明白这个。在所有其他设备上,一切都很好。但是在带有 4.4.4 的 Nexus 7 上,这种奇怪的行为让我头疼:(
public class Main extends Activity implements BeaconConsumer {
/**
* General fields
*/
public WebView mWv;
public ProgressBar mProgressBar;
protected static final String TAG = "printr";
protected AlertDialog mDialog = null;
private Activity mContext;
private int mCounter = 0;
/**
* BLE / Beacon Fields
*/
private BluetoothAdapter mBluetoothAdapter;
private BeaconManager mBeaconManager = BeaconManager.getInstanceForApplication(this);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mContext = this;
mProgressBar = (ProgressBar) findViewById(R.id.progressBar_webView);
mProgressBar.setVisibility(View.GONE);
// Configure WebView
mWv = (WebView) findViewById(R.id.detail_ww);
mWv.setWebChromeClient(new WebChromeClient());
mWv.setWebViewClient(new WebViewClient() {
@Override
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
super.onReceivedError(view, errorCode, description, failingUrl);
mProgressBar.setVisibility(View.GONE);
}
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
if(null != url && !("").equals(url)) {
if(!url.startsWith("file:")) {
//show loading wheel on top of screen
mProgressBar.setVisibility(View.VISIBLE);
}
}
}
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
Log.d(TAG, "FINISHED LOADING PAGE (" + url + ")!");
mProgressBar.setVisibility(View.GONE);
}
});
// Start Beacon Listener
startBeaconManager();
}
private void loadUrl(String url) {
if(url != null && !("").equals(url)) {
Log.d(TAG, "Load URI: " + url);
mWv.stopLoading();
mWv.loadUrl(url);
}
}
protected void loadContentForWebView() {
//maybe do some other stuff
if(mCounter == 1) {
loadUrl("http://www.stackoverflow.com");
} else if(mCounter < 21) {
loadUrl("http://www.google.com");
} else if(mCounter < 41) {
loadUrl("http://www.amazon.com");
} else loadUrl("http://www.yahoo.com");
}
private void startBeaconManager() {
mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
if (mBluetoothAdapter == null) {
// Device does not support Bluetooth
Toast.makeText(
mContext,
"Ihr Gerät unterstützt leider kein Bluetooth 4.0. Die App kann daher nicht vollumfänglich genutzt werden.",
Toast.LENGTH_LONG).show();
} else {
if (!mBluetoothAdapter.isEnabled()) {
if(mBeaconManager.isBound(this)) {
mBeaconManager.unbind(this);
}
Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enableBtIntent, Constants.REQUEST_ENABLE_BT);
} else {
if (!mBeaconManager.isBound(this)) {
// bind beacon manager
//Log.d(TAG, "Bind beacon manager.");
mBeaconManager.bind(this);
}
}
}
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
// settings saved for example
switch(requestCode) {
case Constants.REQUEST_ENABLE_BT:
if(mBluetoothAdapter.isEnabled()) {
startBeaconManager();
} else {
Toast.makeText(
mContext,
"Bitte aktivieren Sie Bluetooth, damit Sie Informationen empfangen können.",
Toast.LENGTH_LONG).show();
}
break;
}
}
@Override
public void onBeaconServiceConnect() {
/**
* Ranging
*/
// Set custom scan periods
mBeaconManager.setBackgroundScanPeriod(Constants.SCAN_PERIOD);
mBeaconManager.setForegroundScanPeriod(Constants.SCAN_PERIOD);
// mBeaconManager.setBackgroundBetweenScanPeriod(60000l);
try {
mBeaconManager.updateScanPeriods();
} catch (RemoteException e) {
Log.e(TAG, "Error setting scan perion: " + e.getMessage());
}
// add beacon layouts for estimote, kontakt beacons, drop beacons etc.
mBeaconManager.getBeaconParsers().add(new BeaconParser().setBeaconLayout(Constants.BEACON_LAYOUT_ALT_BEACON));
mBeaconManager.getBeaconParsers().add(new BeaconParser().setBeaconLayout(Constants.BEACON_LAYOUT_IOS));
mBeaconManager.setRangeNotifier(new RangeNotifier() {
@Override
public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) {
Log.d(TAG, "counter: "+mCounter);
mCounter++;
getNearestBeaconAndPresent();
}
});
try {
mBeaconManager.startRangingBeaconsInRegion(new Region(Constants.MY_REGION_ID, null, null, null));
} catch (RemoteException e) {}
}
protected void getNearestBeaconAndPresent() {
//do some calculations...
presentContent();
}
private void presentContent() {
runOnUiThread(new Runnable() {
public void run() {
if(mCounter % 20 == 0 || mCounter == 1) {
//only load every 20 sec (with wifi!) - to be sure the webview should have finished loading...
mContext.setTitle("Counter: "+ mCounter);
loadContentForWebView();
}
}
});
}
@Override
protected void onDestroy() {
//Log.d(TAG, "onDestroy MAIN");
super.onDestroy();
mBeaconManager.unbind(this);
}
}
清单:
[...]
<uses-sdk
android:minSdkVersion="19"
android:targetSdkVersion="19" />
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.VIBRATE" />
<application
android:allowBackup="true"
android:hardwareAccelerated="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".Splash"
android:configChanges="orientation|keyboardHidden|screenSize"
android:label="@string/app_name"
android:theme="@style/FullscreenTheme" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".ChooseEvent"
android:label="@string/title_activity_login" >
</activity>
<activity
android:name=".Main"
android:parentActivityName=".ChooseEvent"
android:label="@string/title_activity_main" >
</activity>
<activity
android:name=".SetPreferenceActivity"
android:label="@string/action_settings" />
<activity
android:name=".About"
android:label="@string/title_activity_about" >
</activity>
</application>
[...]
【问题讨论】: