Backキー 押下時のエラー
WebViewで何かページを表示した後、Backキー押下時エラーが発生します。
現在、調査中ですが、原因を見つけるアドバイスが欲しいです。
WebViewActivityクラスのsetupUri()に機能を追加してから発生しています。
追加した機能:WebViewで表示する為にリクエストされたURLを種類によって別のURLに上書きする。
機能の追加の仕方やソースの書き方が綺麗でないのは分かっているんですが、どのように整理したら良いか悩んでいます。
package jp.yahuu.hogehoge.app.activities
import android.content.Intent
import android.net.Uri
import android.os.Bundle
import android.webkit.JavascriptInterface
import android.widget.Toast
import jp.yahuu.hogehoge.app.R
import jp.yahuu.hogehoge.app.advertising.AdvertisingIdentifierManager
import jp.yahuu.hogehoge.app.constants.Constants
import jp.yahuu.hogehoge.app.data.feed.user.User
import jp.yahuu.hogehoge.app.fragment.WebFragment
import jp.yahuu.hogehoge.app.proguardHelper.NonObfuscate
import jp.yahuu.hogehoge.app.web.*
import kotlin.properties.Delegates
//import kotlinx.android.synthetic.web_fragment.*
/**
* Created by henrique on 2/13/15.
*/
//リスタートフラグ(ログアウト用)
var restartFlag: Boolean = false
public class WebViewActivity(var uri: Uri? = null): DefaultActivity() {
//ログインページがリクエストされた場合に1になるフラグ
// var loginPageFlag = 0;
private class WebViewFragment():
WebFragment(),
AdEventHandlerDelegate,
FavorEventHandlerDelegate,
ShareEventHandlerDelegate,
NewPageEventHandlerDelegate,
LoginPageEventHandlerDelegate,
LogoutPageEventHandlerDelegate
{
private object KeyName {
val Uri = "Uri"
}
// class Flag() {
// //リスタートフラグ
// var restartFlag: Boolean = false
//
// }
public companion object {
//Function型 fun
public fun newFragment(uri: Uri): WebViewFragment {
val fragment = WebViewFragment()
val args = Bundle()
args.putString(KeyName.Uri, uri.toString())
fragment.setArguments(args)
return fragment
}
}
private fun getWebViewActivity(): WebViewActivity {
return getActivity() as WebViewActivity
}
override fun getEventHandlers(): Collection<EventHandler> {
return arrayListOf(
AdEventHandler(this),
FavorEventHandler(this),
ShareEventHandler(this),
CurrentPageEventHandler(this),
NewPageEventHandler(this),
LoginPageEventHandler(this),
LogoutPageEventHandler(this)
)
}
override fun setupWebView() {
super<WebFragment>.setupWebView()
webView.addJavascriptInterface(object: NonObfuscate {
JavascriptInterface
public fun startSharing(url: String, title: String) {
val intent = Intent(Intent.ACTION_SEND)
intent.setType("text/plain")
intent.putExtra(Intent.EXTRA_TEXT, title + "\n" + url)
intent.putExtra(Intent.EXTRA_SUBJECT, title)
startActivity(Intent.createChooser(intent, "共有"))
}
}, "Android")
}
// Delegates methods
override fun openAd(uri: Uri) {
openUri(uri)
}
private fun enfavor(identifier: Int) {
User.addBookmark(identifier)
Toast.makeText(getActivity(), "お気に入りに登録しました", Toast.LENGTH_LONG).show()
}
private fun defavor(identifier: Int) {
User.removeBookmark(identifier)
Toast.makeText(getActivity(), "お気に入りから削除しました", Toast.LENGTH_LONG).show()
}
override fun favorEvent(eventType: FavorEventType, identifier: Int) {
when (eventType) {
FavorEventType.Enfavor -> enfavor(identifier)
FavorEventType.Defavor -> defavor(identifier)
}
}
override fun shareEvent() {
webView.loadUrl("javascript:Android.startSharing(get_actual_URL(),get_actual_title());")
}
//新しいアクティビティの場合?
override fun openUriInNewPage(uri: Uri) {
openUriInNewWebViewActivity(uri)
}
override fun showLoginPage() {
val uri = Uri.parse("https://yahuu-ni.jp/users/sign_in")
openUriInNewPage(uri)
}
override fun userWillLogout() {
//クッキーを削除して、トップ画面に遷移する。
println("ログアウトをタッチした。")
val uri = Uri.parse("https://yahuu-ni.jp/logout")
openUriInNewPage(uri)
restartFlag = true
// //再起動フラグを上げる
// restart()
// //ダイアログでログアウトを選択した場合?
// userDidLogout()
// val uri = Uri.parse("https://yahuu-ni.jp/logout")
// openUriInNewPage(uri)
}
override fun userDidLogout() {
println("userDidLogout")
}
}
private object RegexPattern {
val ArticlePattern = "-?\\d+(\\.\\d+)?"
}
private val articleRegex by Delegates.lazy {
WebViewActivity.RegexPattern.ArticlePattern.toRegex()
}
private fun setupUri() {
if (this.uri == null) {
//varは通常の変数
var u = getIntent()
.getStringExtra(
getResources()
.getString(R.string.default_webview_activity_uri)
)
println("u: $u")
//トップページがリクエストされた場合
//ログイン後遷移http://yahuu-ni.jp/,アプリ起動時https://yahuu-ni.jp/
//ログアウト後遷移https://yahuu-ni.jp/
if(u.equals("http://yahuu-ni.jp/") || u.equals("https://yahuu-ni.jp/")){
//上書きuri
u = "http://yahuu-ni.jp/mypage"
}
//urlがnullじゃない場合
if (u != null) {
//もしuがnullの場合NullPointerException
val parsedUri = Uri.parse(u)
//ドメインがやほー(teru or false)
val ishogehoge = Constants.ishogehogeDomain(parsedUri
)
//ドメインがやほーの場合
val newUri: Uri = if (ishogehoge) {
println("parsedUri: $parsedUri")
println("articleRegex: $articleRegex")
// ログイン済みの場合、「https://yahuu-ni.jp/」が再リクエストされてここ落ちる
//パス部がnull
//parsedUri → https://yahuu-ni.jp/users/sign_in isArticle:false
val isArticle = parsedUri.getLastPathSegment().matches(articleRegex)
println("isArticle: $isArticle")
//article(記事)の場合?
val builder: Uri.Builder = if (isArticle) {
val identifier = parsedUri.getLastPathSegment().toInt()
User.addHistory(identifier)
val favored = User.containsInBookmark(identifier)
val flag = if (favored) {
1
} else {
0
}
parsedUri.buildUpon()
.appendQueryParameter("favored", "$flag")
//記事以外の場合
} else {
parsedUri.buildUpon()
}
builder.appendQueryParameter(
"idfa",
AdvertisingIdentifierManager.information.identifier
).build()
} else {
parsedUri
}
this.uri = newUri
println("new Uri: $newUri")
}
}
}
//リスタート処理
private fun restart(){
println("restart")
if (restartFlag) {
// //fragmentの終了 onDestroyが呼び出される
//// getFragmentManager().beginTransaction().remove(this).commit()
//
//// getFragmentManager().popBackStack()
// activity.finish();
val intent = getIntent()
overridePendingTransition(0, 0)
intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION)
finish()
overridePendingTransition(0, 0)
startActivity(intent)
}
}
/***
* Fragmentが破棄される時、最後に呼び出される
*/
@Override
override fun onDestroy() {
// まずはデストロイを走らせる、アクティビティのフィニッシュか?fragmentか? http://attyo0.blog.fc2.com/blog-entry-9.html
println("onDestroy")
if (restartFlag) {
restartFlag = false;
//ここにメインアクティビティのインテント
// val intent = Intent(getApplicationContext(), javaClass<MainActivity>())
//// intent.putExtra(getResources().getString(R.string.default_webview_activity_uri), uri.toString())
//
// startActivity(intent)
println("ここにメインアクティビティのインテント")
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super<DefaultActivity>.onCreate(savedInstanceState)
setContentView(R.layout.activity_webview)
//ログアウト
if (restartFlag) {
println("restart() アプリ再起動")
restart()
}
println("setupUri()")
setupUri()
if (savedInstanceState == null) {
val newFragment = WebViewFragment.newFragment(uri!!)
getFragmentManager()
.beginTransaction()
.add(R.id.web_view_container, newFragment)
.commit()
}
getSupportActionBar().hide()
}
}
↓↓↓↓↓↓↓↓↓↓↓↓↓↓エラーログ↓↓↓↓↓↓↓↓↓↓↓↓↓↓
09-28 12:04:47.297 13985-13985/jp.yahuu.hogehoge.app I/System.out﹕ onDestroy
09-28 12:04:47.297 13985-13985/jp.yahuu.hogehoge.app D/AndroidRuntime﹕ Shutting down VM
09-28 12:04:47.297 13985-13985/jp.yahuu.hogehoge.app E/CrashReporting﹕ ParseCrashReporting caught a SuperNotCalledException exception for jp.yahuu.hogehoge.app. Building report.
09-28 12:04:47.300 13985-13985/jp.yahuu.hogehoge.app E/CrashReporting﹕ Handling exception for crash
android.util.SuperNotCalledException: Activity {jp.yahuu.hogehoge.app/jp.yahuu.hogehoge.app.activities.WebViewActivity} did not call through to super.onDestroy()
at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:3695)
at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:3724)
at android.app.ActivityThread.access$1400(ActivityThread.java:151)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1357)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5254)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
09-28 12:04:47.300 13985-13985/jp.yahuu.hogehoge.app D/CrashReporting﹕ Generating report file for crash
--------- beginning of system
09-28 12:04:47.395 13985-13985/jp.yahuu.hogehoge.app W/ge.hogehoge.app﹕ type=1400 audit(0.0:58): avc: denied { read } for name="mem" dev="debugfs" ino=443991 scontext=u:r:untrusted_app:s0 tcontext=u:object_r:debugfs:s0 tclass=file
09-28 12:04:47.395 13985-13985/jp.yahuu.hogehoge.app W/ge.hogehoge.app﹕ type=1400 audit(0.0:59): avc: denied { read } for name="mem" dev="debugfs" ino=443991 scontext=u:r:untrusted_app:s0 tcontext=u:object_r:debugfs:s0 tclass=file
09-28 12:04:47.471 13985-13985/jp.yahuu.hogehoge.app D/CrashReporting﹕ Retrieving logcat output...
09-28 12:04:47.526 13985-13985/jp.yahuu.hogehoge.app D/CrashReporting﹕ Retrieving logcat output...
09-28 12:04:47.576 13985-13985/jp.yahuu.hogehoge.app D/CrashReporting﹕ Retrieving logcat output...
09-28 12:04:47.653 13985-13985/jp.yahuu.hogehoge.app V/CrashReporting﹕ About to start ReportSenderWorker from #handleException
09-28 12:04:47.657 13985-15035/jp.yahuu.hogehoge.app D/CrashReporting﹕ #checkAndSendReports - start
09-28 12:04:47.657 13985-15035/jp.yahuu.hogehoge.app D/CrashReporting﹕ Looking for error files in /data/data/jp.yahuu.hogehoge.app/files/com.parse/cr/reports
09-28 12:04:47.657 13985-15035/jp.yahuu.hogehoge.app D/CrashReporting﹕ Loading file 1443409487300-SuperNotCalledException-10.stacktrace
09-28 12:04:47.664 13985-15035/jp.yahuu.hogehoge.app I/CrashReporting﹕ Sending file 1443409487300-SuperNotCalledException-10.stacktrace
09-28 12:04:47.664 13985-15035/jp.yahuu.hogehoge.app D/CrashReporting﹕ Sending crash report to Parse...
09-28 12:04:47.667 13985-15035/jp.yahuu.hogehoge.app D/CrashReporting﹕ #checkAndSendReports - finish
--------- beginning of crash
09-28 12:04:47.755 13985-13985/jp.yahuu.hogehoge.app E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: jp.yahuu.hogehoge.app, PID: 13985
android.util.SuperNotCalledException: Activity {jp.yahuu.hogehoge.app/jp.yahuu.hogehoge.app.activities.WebViewActivity} did not call through to super.onDestroy()
at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:3695)
at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:3724)
at android.app.ActivityThread.access$1400(ActivityThread.java:151)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1357)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5254)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)