投稿

【PHP】Gmail認証 - ログインと認証チェック -

イメージ
Gmailを使ってGoogle認証APIでログインを実装する方法、またログイン後の認証チェックを実装してみます。 前提としてGoogle APIsコンソール(以下URL)からサービスキーを発行します。 https://console.developers.google.com/apis/dashboard ※なお今回FuelPHPを使って実装していますが、フレームワークの特別な機能は特に使用していません。 事前準備 サービスキー発行 Google APIsコンソールへサインイン https://console.developers.google.com/?hl=JA Google APIsコンソールの左側メニュー → 認証情報 → 認証情報を作成 → OAuth クライアント ID 必要項目を入力 名前 任意のアプリケーション名を入力 承認済みの JavaScript 生成元 今回は使用しません 承認済みのリダイレクト URI 認証後にGoogleからコールバックされるエンドポイント 保存ボタンで client_id と client_secret が発行される ※OAuth同意画面でアプリケーションのスコープを指定することができます。これを内部にすると、組織内のGmailアカウントに限定されるので、社内システムなどの開発で使用する際はではチェックすると良いです。 ログイン処理 Google Api Key設定ファイル fuel/app/config/test/apikeys.php 事前準備で発行したclient_idとclient_secretを設定ファイルへ定義します。 <?php /** * Google API Keys */ return array( 'client_id' => '00000000-xxxxxxxx.apps.googleusercontent.com',

【PHP】FuelPHP - Model_Crudの作り方と使い方

FuelPHPにおける Model_Crud とはいわゆるORマッパーと呼ばれるもので、テーブルにおけるCRUD操作を劇的に簡単にします。 今回はこれとMySQLを使ってかんたんなCRUD処理を作ってみます。 データベース 使用するテーブル 以下のようなテーブルを用意しました。 定義 >SHOW CREATE TABLE products; CREATE TABLE `products` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '商品ID', `name` varchar(16) DEFAULT NULL COMMENT '商品名', `price` varchar(16) DEFAULT NULL COMMENT '価格', `created_at` datetime DEFAULT CURRENT_TIMESTAMP COMMENT 'レコード作成日', `updated_at` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT 'レコード更新日', `is_deleted` tinyint(1) DEFAULT '0' COMMENT '削除フラグ', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='商品マスタ'; データ >SELECT * FROM products; +----+-----------+-------+---------------------+------------+------------+ | id | name | price | created_at | updated_at | is_deleted | +----+-----------+-------+---------------------+------------+------------+ | 1 | りんご | 10

【PHP】PHPでWebSocketサーバー - クライアント・サーバー間通信 -

イメージ
前回の記事 でPHPにより実装したWebSocketサーバーを介してのクライアント間通信を実装しました。 今回はサーバー側から一方的にクライアントへメッセージを送信してみたいと思います。 使用するライブラリは以下を使用しましたが、結果を先に言ってしまうとelephant.ioのほうはうまく行きませんでした。以下にその手順と結果を残しておきます。 wisembly/elephant.io textalk/websocket サーバーからメッセージ送信 (wisembly/elephant.io) ライブラリのインストール composer.json composer.json の require に以下を追加 "wisembly/elephant.io":"~3.0" 以下コマンドでインストール $ ./composer.phar update --lock Loading composer repositories with package information Updating dependencies (including require-dev) Package operations: 1 install, 0 updates, 0 removals - Installing wisembly/elephant.io (v3.3.1): Loading from cache Package guzzle/common is abandoned, you should avoid using it. Use guzzle/guzzle instead. Package guzzle/http is abandoned, you should avoid using it. Use guzzle/guzzle instead. Package guzzle/parser is abandoned, you should avoid using it. Use guzzle/guzzle instead. Package guzzle/stream is abandoned, you should avoid using it. Use guzzle/guzzle instead.

【PHP】PHPでWebSocketサーバー - クライアント間の通信 -

イメージ
以下の記事を参考にWebSocketをサーバーを立てて、docker+FuelPHP上で実行してみました。 http://madroom-project.blogspot.com/2013/04/phpwebsocket.html なお、FuelPHPについてフレームワークとしての機能は使用していませんので、どんなフレームワークを使っても同じ方法で行けると思います。 ライブラリのインストール composer.json の require に以下を追加 "cboden/Ratchet": "0.2.*" 以下コマンドでインストール $ ./composer.phar update --lock Loading composer repositories with package information Updating dependencies (including require-dev) Package operations: 1 install, 0 updates, 0 removals - Installing textalk/websocket (1.0.3): Loading from cache Package guzzle/common is abandoned, you should avoid using it. Use guzzle/guzzle instead. Package guzzle/http is abandoned, you should avoid using it. Use guzzle/guzzle instead. Package guzzle/parser is abandoned, you should avoid using it. Use guzzle/guzzle instead. Package guzzle/stream is abandoned, you should avoid using it. Use guzzle/guzzle instead. Writing lock file Generating autoload files 実装 WebSocketサーバー側 以下をプロジェクトの適当なディレクトリに配置します。(requ

【js】ブラウザの言語設定により表示する文字を切り替える

イメージ
Javascriptを利用してブラウザで設定されている言語を取得し、言語によって表示を切り替える方法をまとめます。 Javascriptでブラウザの言語設定を取得する方法は、使用するブラウザによって異なります。 これは以下の記事を参考にしました。 https://easyramble.com/get-language-setting-by-javascript.html 方法としてはonloadでブラウザの言語設定を取得して、あらかじめ2パターン用意した記述の片方を非表示にします。 実装 ブラウザの言語設定取得 language_test.html <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Laungage Test</title> <style type="text/css"> <!-- #body { margin-left: 1em; margin-right: 1em; } --> </style> <script> window.onload = function() { var language; if (navigator.browserLanguage != null) { // Internet Explorer, Opera, 他 language = navigator.browserLanguage.substr(0, 2); } else if(navigator.userLanguage != null) { // Internet Explorerの場合 language = navigator.userLanguage.substr(0, 2); } else if(navigator.language != null) { // Chro

【git】git操作まとめ

gitについてよく使う操作をまとめました。 ブランチ操作 作業ブランチの作成と削除をよく使うのでメモしておきます。 以下はmasterを派生元ブランチとして作業ブランチを作成する場合の例です。 作業ブランチの作成 # masterブランチへ切り替え git checkout master # ローカルブランチがmasterに切り替わっていることを確認する git branch # ローカルに開発ブランチを作成する git branch develop/xxxxx # サーバーにプッシュする git push origin develop/xxxxx # ローカルに作ったブランチを削除する git branch -D develop/xxxxx # 中央リポジトリへ追加する # これをすることで他の作業者がこのブランチが見れるようになる git branch --track develop/xxxxx origin/develop/xxxxx # ローカルブランチを切り替える git checkout develop/xxxxx 不要になったブランチを削除 # ローカルブランチを削除 git branch -D develop/xxxxx # 中央リポジトリからブランチを削除 git push origin :develop/xxxxx タグに関する操作 タグ付け # ローカルでタグを付ける git tag release_v1.0 # ローカルで付けたタグをサーバーへ反映 git push origin release_v1.0 タグを削除 # ローカルでタグを削除 git tag -d release_v1.0 # リモートのタグを削除 git push origin :release_v1.0 タグの一覧表示 # ローカルのタグ一覧を表示 git tag # リモートのタグ一覧を表示 git ls-remote --tags タグをチェックアウト # タグをチェックアウト git checkout refs/tags/[タグ名] コミットの取り消しとリモート反映 リモートにプッシュしてしまったコミットを取り消す方法 コミットIDの取得 git log 等で戻したいコミットのコミットIDを

【Android】Realmの基礎 - 検索・追加・更新・削除 -

イメージ
Androidアプリケーションで、Realmを使ったデータの取り扱いについてまとめました。 Realmとは モバイルデバイス向けのデータベースです。Realmが登場するまではSQLiteなどが一般的でした。 もっと詳しくという人は、こちらの記事が分かりやすいと思います。 https://mynavi-agent.jp/it/geekroid/2015/03/realm-realm-tech-talk-.html 実装 ライブラリを追加 app/build.gradle dependenciesに以下の2行を追加して同期します。 implementation 'io.realm:realm-android:+' annotationProcessor 'io.realm:realm-android:+' データ型の定義について データ型はRealmObjectを継承したクラスによって定義します。 これはデータベースで言うところのテーブルに当たります。 ここではIDと名前の2項目を持った単純なテーブルを作ります。 import io.realm.RealmObject; public class Item extends RealmObject{ private int id; private String name; public void setId(int id) { this.id = id; } public int getId() { return id; } public void setName(String name) { this.name = name; } public String getName() { return name; } } Realmインスタンスを取得 インスタンスの取得は以下で行います。 以降このインスタンスを使って検索・追加・更新・削除を行います。 Realm realm = Realm.getInstance(this); データの検索 // 登録データ全件を取得する RealmResults

【Android】LocationListenerで位置情報を取得する

イメージ
GPSから位置情報を利用したアプリがよくありますが、LocationListenerを使えば緯度・経度や、高度などが取得できます。 ということでここでは、AndroidでLocationListenerを使った位置情報の取得についてまとめてみます。 実装 権限を追加 AndroidManifest.xml 以下の権限を追加します。なお、アプリケーションから権限のについては備考にまとめた記事のリンクをご確認ください。 <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_GPS" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> ACCESS_COARSE_LOCATIONはネットワーク経由で位置情報を取得するのに必要な権限です。 そのためINTERNETの権限も必要になります。 ACCESS_GPSとACCESS_FINE_LOCATIONは、GPSを使用した位置情報を取得するのに必要な権限です。 位置情報の取得処理 MainActivity.java Activityで実装した場合の単純な例が以下になります。 public class MainActivity extends AppCompatActivity implements LocationListener { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activ

【Android】アプリケーションから権限の取得方法

イメージ
Androidアプリケーションがデバイスの機能へアクセスする場合、利用者に権限を許可してもらう必要があります。 デバイスの機能とは以下のようなものです。 連絡先 位置情報 内部ストレージ カメラ etc ・・・ ここでは連絡先を利用するアプリケーションを作ると想定して、どのように実装するのかをまとめます。 実装 対象権限の追加 AndroidManifest.xml AndroidManifest.xmlに取得したい権限を追加します。 <uses-permission android:name="android.permission.READ_CONTACTS" /> 権限を貰うための処理 MainActivity.java public class MainActivity extends AppCompatActivity { /** * onCreate * @param savedInstanceState */ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // このアプリケーションに連絡先にアクセスする権限が許可されているかチェック if (PermissionChecker.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_CONTACTS,}, 0); } else{ ((TextView) findV

Acer Chrome Book を使ってみた感想

イメージ
ミーティング用のノートPCが欲しいと思い Acer Chromebook C730E-N12M を購入しました。 まずはChrome Bookについて簡単に説明します。 外観 特徴 WindowsでもMacでもLinuxでもないGoogle社が開発したChrome OSを搭載 Chromeブラウザで全ての作業を行う 基本的にオンライン前提 最近はChromeブラウザ用のアプリも増えてきているので何でも出来るといっても過言ではないかもしれません。 以下に(あくまで自分が感じた)メリット/デメリットをまとめてみました。 メリット(便利だと思った点) ブラウジングが快適 三本指の左右スライドでタブ移動、二本指の上下スライドでスクロール、ネットサーフィンが捗ります。 ウイルス対策の必要が無い 必要がないと言うと語弊かもしれませんが、Chromeブラウザにあらかじめ組み込まれているセキュリティ対策機能が常に最新にアップデートされます。 ただしChromeウェブストアには入力情報や閲覧履歴を収集するようなスパイウェアと呼ばれるアプリが少なからず存在するようです。 WebストアからGoogle社製以外のアプリをインストールする際は注意しましょう。 起動の早さ、バッテリ駆動時間、堅牢性 これはChrome Bookの特徴であり、多くの方が書かれています。 起動というか落とす必要がないので基本的に開ければすぐに使えます。 バッテリも私の場合は1日使っても1、2時間ぐらいですが1週間ぐらいは持ちます。 堅牢性はこの機種の特徴ですが、非常に丈夫(そう)な作りとなっています。 デメリット(困った点) パスワード付きのエクセル(Office系ドキュメント)が開けない これが今一番困ってます。 おそらくOffice系ドキュメント全般だと思うんですが、現在対応中だそうです。 毎日持ち歩くには少々重い 重量約1.4kgですが最近のノートPCと比べると少々重いです。 これは堅牢製を売りにした機種なのでその対価といえるでしょう。 他のChrome Bookは軽量な機種もたくさんあります。 総評 ★★★★☆ (デメリットの1が解決したなら★5です) コストパフォーマンスを考えると非常に満足し

【Go言語】環境構築・動作確認・並列処理

Go言語は2009年にGoogleより発表されたプログラミング言語です。 シンプルな言語体系によりプログラミングが非常に容易であることが特徴です。多種多様のプログラミング言語があるなか学習コストが抑えられるというのは非常に大きいことだと思います。 また、軽量な動作で強力な処理能力を持ちます。実際に使ってみたんですが、数百のプロセスからなる並列処理を簡単に実装できました。 今回このGo言語を仕事で扱う機会がありましたので、忘れないうちにまとめておこうと思います。 環境構築 インストール先 /usr/local/go インストール手順 $ cd /usr/local $ # もちろんwgetでなくても可 $ # WARNING: certificateが出るなら --no-check-certificate $ wget https://storage.googleapis.com/golang/go1.5.1.linux-amd64.tar.gz $ tar xvpf go1.5.1.linux-amd64.tar.gz $ rm go1.5.1.linux-amd64.tar.gz ※バージョンは適時修正 環境変数の設定 $ export GOROOT=/usr/local/go $ export GOPATH=/usr/local/go/.go $ PATH=$PATH:$HOME/bin:${GOROOT}/bin 環境変数の確認 $ go env GOARCH="amd64" GOBIN="" GOEXE="" GOHOSTARCH="amd64" GOHOSTOS="linux" GOOS="linux" GOPATH="/usr/local/go/.go" GORACE="" GOROOT="/usr/local/go" GOTOOLDIR="/usr/local/go/pkg/tool/linux_amd64" GO15VENDOREXPERIMENT=""

【Android】アノテーション @SharedPref を使う

Androidアプリケーションで設定などの値を保存する際に、アノテーションを利用して簡単に読み書きする方法をまとめてみます。 まずは通常の SharedPreferences クラスを利用する例が以下です。 SharedPreferencesクラスを使った例 // SharedPreferencesクラスを実体化 SharedPreferences preferences = getSharedPreferences("data", Context.MODE_PRIVATE); // IDを読み込み int id = preferences.getInt("id", 0); // IDを書き込み SharedPreferences.Editor editor = preferences.edit(); editor.putInt("id", 123); editor.apply(); これをアノテーション @SharedPref を使って書くと次のようになります。 @SharedPrefを使った例 // ※これはメンバー変数 @Pref static MyPreference_ preference; // IDを読み込み int id = preference.id().get(); // IDを書き込み preference.id().put(123); Editorを作ったり、keyを指定したりしなくていいのでだいぶすっきりします。 保存する設定値が多くなればなるほど、使いやすさが実感できると思います。 ただしこれを利用するにはもちろん前準備が必要になるので説明します。 前準備 ライブラリを追加 app/build.gradle dependencies { … } に以下の2行を追加します。 annotationProcessor "org.androidannotations:androidannotations:+" implementation "org.androidannotations:androidannotations-api:+" SharedPrefインターフェースを作成 以下のようなインタ

【Android】アプリケーションの開発で環境を切り替えてビルドする方法

イメージ
クライアントサーバー型のアプリケーションを開発していると、開発/ステージング/本番でそれぞれビルドを用意しなくてはならないときがあります。 ほとんどの開発現場でこのようなサーバー構成を取っているのではないかと思います。 今回は環境毎に用意されたstring.xmlを読み込む方法をまとめてみました。 環境の切り替え Build Variants 切り替えは Android Studio の左下の Build Variants をクリックします。 すると Build Variants のウィンドウが出ますので、ここで切り替えを行います。 しかし、初期状態では debug と release の二つしかありません。 これはビルドする際のオプションのことで、今回やろうとしている環境ごとのビルドとは関係ありません。 ここに冒頭の「3つの環境」×「オプションの2つ」の計6個の Build Variants を表示する方法が次の手順になります。 Build Variantsの修正 環境を追加 app/build.gradle productFlavors に各環境を定義します。 // フレーバーディメンション flavorDimensions "default" // プロダクトフレーバー productFlavors { develop { applicationId = '[パッケージ名].dev' } staging { applicationId = '[パッケージ名].stg' } product { applicationId = '[パッケージ名]' } } applicationId にはパッケージ名を指定しますが、ここを環境ごとに変えておくことで、一つのデバイスに全てのバージョンをインストールすることが可能になります。 flavorDimensions は productFlavors が複数あるとき優先順位を決めなくてはいけないので一旦 default とし

【Android】Fragmentを使う② - ActivityとFragmentの相互呼び出し -

イメージ
前回 の記事でFragmentの簡単な実装について書きました。今回はそれの応用編です。 Fragmentに定義したメソッドをActvity側から呼び出したり、FragmentからAcitivityのメソッドを呼び出す方法をまとめます。 ActivityからFragmentのメソッドを実行する まずは親レイアウトであるMainActivity側から、それぞれのFragmentに定義してあるメソッドを実行してみます。この場合Fragment側に特別な処理は必要なく、呼び出し元のMainActivityのみで完結します。 メインのレイアウトにボタンを追加する activity_main.xml <LinearLayout android:id="@+id/llButton" android:gravity="center_horizontal" android:orientation="horizontal" android:layout_below="@id/mainText" android:layout_width="match_parent" android:layout_height="wrap_content"> <Button android:id="@+id/buttonTest1" android:text=" Fragment 1 -> TEST " android:padding="5dp" android:layout_margin="5dp" android:textAllCaps="false" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <Button

【Android】Fragmentを使う① - 単純なFragmentの実装 -

イメージ
FragmentはActivityに設置するViewを機能ごとに小分けして、元来Activityに集中しがちだったロジックを細分化する方法です。 複数人で開発しているときはコンフリクトがおきにくいのでかなり便利です。 今回はFragmentの単純な例を実装してみました。 画面構成 画面の構成としてはMainActivityの下に、2つのFragmentが紐付いている状態です。 2つのFragmentはそれぞれのレイアウト構成ファイルを読み込んでいます。 実装 ライブラリの追加 app/build.gradle annotationProcessor "org.androidannotations:androidannotations:+" implementation "org.androidannotations:androidannotations-api:+" レイアウトファイル layout/fragment_main1.xml Fragment1で使用するレイアウトを定義します。 ここではTextView、EditText、Buttonの3つのViewを設置しています。 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#ffa" android:padding="5dp" android:orientation="vertical"> <TextView android:id=&quo

【Android】Viewの装飾

イメージ
TextViewやEditTextをはじめとするViewクラスを継承する多くのViewは、様々な装飾をすることが可能です。 個人アプリは特にシンプルなUIになりがちですが、こうした装飾をすることで見た目が一気にグレードアップします。 ここではいくつかそのサンプルを上げておきます。 実装 装飾を定義したファイルの準備 drawble/view_frame.xml 方法としては、drawble配下に装飾用の定義を記述したxmlファイルを用意しておき、Viewのバックグラウンドに指定します。 xmlファイルを追加は、プロジェクトメニューの drawbleを右クリック → New → File で追加します。 ファイル名は任意で、view_frame.xmlとした場合、適用したいViewのbackground属性に以下のように設定します。 android:background="@drawble/view_frame" 装飾定義ファイルには、shapeタグとその子要素によって記述します。 どのように記述していくのかを以下に記載していきます。 枠線をつける drawble/view_frame.xml まずはシンプルに枠線をつけてみます。特にデフォルトのEditTextは枠線がなく、明るい画面にデフォルトのEditTextだと入力欄であることが気づきにくいという難点があるので枠線は必須だと個人的に思ってます。 <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"> <stroke android:width="2dp" android:color="#232323" /> </shape> strokeタグでEditTextに枠線をつけます。 widthで線の幅、colorで色を指定できます。 背景色をつける drawble/view_frame.xml これもよく使います。EditTextでは特に淡

【Java】マルチバイトを含んだ文字列を指定バイト数で切る

マルチバイトを含んだ文字列を指定バイト数で切って、切った場合に三点リーダを付与する関数を作りました。半端な場合(マルチバイト文字の途中で切れる)は、その文字ごと切り捨てます。 方法としては文字列を一文字ずつ取り出して、それがシングルバイトなのかマルチバイトなのかを判定します。 判定はStringクラスの getBytes(StandardCharsets.UTF_8).length が1ならシングルバイトとしています。 なお三点リーダも文字列と考慮するので、マルチバイト一文字分を含めても切る必要がない場合は何もしないものとします。 実装 共通クラス StringUtils.java staticメソッドで定義しました。これをコピってそのまま使えます。 public class StringUtils { /** * 文字列を指定バイト数で切って、切った場合三点リーダを付与する * @param value * @param byteLength * @return */ public static String truncate(String value, int byteLength) { if(value == null) { return null; } if(getByte(value) <= byteLength + 2) { return value; } String ret = ""; int b = 0; for(int i = 0; i < value.length(); i++) { String target = value.substring(i, i + 1); if(target.getBytes(StandardCharsets.UTF_8).length == 1) { b++; } else{ b += 2;

【Android】全面広告を表示する

イメージ
無料アプリの収益化で利用するAdMob広告において、全面に表示される Interstitial型広告についての実装です。 この広告はバナー型より収益が見込めますが、あまり頻繁に表示されるとユーザーにとってあまり印象がよくありません。そのため起動時、3回に1回の頻度等に制限するのがベターです。 また、バナー型に比べて広告の読み込み処理に時間がかかるのと、画面全体に表示されるため、いきなり出てきた場合ユーザーの誤クリックを招いてしまいます。そのため広告のローディング中はプログレスダイアログを出して操作不可にしておく処理を入れておくと良いです。プログレスダイアログに関しては以下の記事にまとめています。 WebViewのロード完了までプログレスダイアログを表示する 事前準備として、広告タイプがインタースティシャル型の、adUnitIdを発行します。※adUnitIdの発行については以下をご確認ください。 Androidアプリでバナー型広告を表示する 実装 ライブラリの追加 app/build.gradle まずはバナー型と同様、以下のライブラリをdependenciesに追加します。 compile 'com.google.android.gms:play-services:+' 権限の追加 AndroidManifest.xml こちらもバナー型と同様です。 <uses-permission android:name="android.permission.INTERNET" /> 広告IDの設定 values/string.xml インタースティシャル型で発行したadUnitIdを定義します。 <string name="interstitial_ad_unit_id">ca-app-pub-3940256099942544/1033173712</string> 全面広告のインスタンス取得 これは広告のインスタンス取得をメソッドにしたものです。メインスレッドで呼び出します。 /** * 全面広告のインスタンスを取得 * @return InterstitialAd */ private InterstitialAd new

【Android】WebViewのロード完了までプログレスダイアログを表示する

イメージ
WebViewに限ったことではないですが、重たい処理を実行中にローディング中であることを示すダイアログを表示する方法のまとめです。 画面の初期化やファイルの読み込み・書き込みなど様々な用途に応用できます。 今回はWebViewClientを継承したクラスを作ってonPageFinished()メソッドなどを実装します。 実装 プログレスダイアログの生成 変数(progressDialog)はメンバ変数、もしくはfinalで宣言する必要があります。理由はダイアログを閉じる時にメインスレッドとは別のスレッドからアクセスすることになるのでメソッド内のローカル変数だとエラーになります。 progressDialog = new ProgressDialog(this); progressDialog.setMessage("Loading..."); progressDialog.show(); プログレスダイアログの表示開始と主処理開始 HandlerクラスはUIスレッド(つまりメインスレッド)へRunnableを渡してUIや画面側を処理することが来ます。ここではWebViewのローディングと、その中のonPageFinishedメソッドでダイアログの停止を行っています。 // スレッド内でプログレスダイアログを閉じるためにHandlerを生成 final Handler handler = new Handler(); // スレッド処理 new Thread(new Runnable() { @Override public void run() { try { handler.post(new Runnable() { @Override public void run() { // ※ここで本来行いたい処理をする webView.loadUrl("https://news.google.com/"); } }); } catch (E