Thread

ファイルのダウンロード、大量データのDBへの投入は、時間がかかる重たい処理・・・。

package com.bgstation0.android.sample.thread_;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends Activity implements OnClickListener{	// View.OnClickListenerを実装.

    // メンバフィールドの定義.
    private final String TAG = "Thread_";	// TAG"Thread_"の定義.
	
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        // button1を取得し, OnClickListenerとして自身をセット.
        Button button1 = (Button)findViewById(R.id.button1);	// findViewByIdでR.id.button1を取得.
        button1.setOnClickListener(this);	// button1.setOnClickListenerでthis(自身)をセット.
        
    }

    // View.OnClickListenerインタフェースのオーバーライドメソッドを実装.
    public void onClick(View v){	// onClickをオーバーライド.
    	
    	// Thread.sleepで擬似的に重たい処理を実行.
    	// tryで囲まないといけない.
    	try{
    		Log.d(TAG, "Thread.sleep before");	// Log.dで"Thread.sleep before"とログ出力.
    		Thread.sleep(10000);	// Thread.sleepで10秒休止.
    		Log.d(TAG, "Thread.sleep after");	// Log.dで"Thread.sleep after"とログ出力.
    	}
    	catch(Exception ex){
    		Log.d(TAG, "ex = " + ex.toString());	// Log.dでexを出力.
    	}
    	
    }
    
}

button1を押したら、重たい処理をするような場合を再現する・・・。
といっても、Thread.sleepで疑似的に10秒かかるような処理にしているだけ・・・。

Thread | Android Developers

これで実行し、

f:id:BG1:20161003150115p:plain

Button1を押すと、

f:id:BG1:20161003150155p:plain

押した状態のまま10秒間固まってしまう・・・。

f:id:BG1:20161003150339p:plain

押した瞬間はbeforeだけ・・・。

f:id:BG1:20161003150456p:plain

afterが出たので、左を見ると、

f:id:BG1:20161003152409p:plain

だいたい10秒・・・。

この間、UIが固まってしまうと他の操作を受け付けられないので、こういう重たい処理はThreadに任せる・・・。

Thread | Android Developers

Java標準のThreadクラスで重たい処理を別スレッドにする・・・。

f:id:BG1:20161003151433p:plain

今回はThreadの派生クラスCustomThreadを定義し、

runの中に実行する重たい処理を書く・・・。

MainActivityでは、

CustomThreadオブジェクトctを作ったら、ct.startでスレッド開始・・・。

f:id:BG1:20161003151949p:plain

これでもう一度ボタンを押しても、ボタンが押された状態のまま、固まらなくなる・・・。

Sample/android/Thread/Thread/src/Thread at master · bg1bgst333/Sample · GitHub