2016年6月29日 星期三

多執行緒範例


public class MainActivity extends Activity {

    private TextView timer1, timer2;
    private Button start1, stop1, zero1, start2, stop2, zero2, end;
    private int timesec1=0, timesec2=0, csec1=0, csec2=0, cmin1=0, cmin2=0;
 
    // 宣告執行緒 Thread1
    ClockThread1 thread1 = new ClockThread1();
    // 宣告執行緒 Thread2
    ClockThread2 thread2 = new ClockThread2();
 
    // 宣告 Handler
    Handler handler = new Handler();
 
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

    timer1 = (TextView)findViewById(R.id.timer1);
    start1 = (Button)findViewById(R.id.start1);
    stop1 = (Button)findViewById(R.id.stop1);
    zero1 = (Button)findViewById(R.id.zero1);
     
    timer2 = (TextView)findViewById(R.id.timer2);
    start2 = (Button)findViewById(R.id.start2);
    stop2 = (Button)findViewById(R.id.stop2);
    zero2 = (Button)findViewById(R.id.zero2);
     
    end  = (Button)findViewById(R.id.end);
     
    start1.setOnClickListener(listener);
    start2.setOnClickListener(listener);
    stop1.setOnClickListener(listener);
    stop2.setOnClickListener(listener);
    zero1.setOnClickListener(listener);
    zero2.setOnClickListener(listener);
    end.setOnClickListener(listener);
}

    // 第一個執行緒
    public class ClockThread1 extends Thread {
        public void run(){
            timesec1++;
            csec1 = timesec1 % 60;
            cmin1 = timesec1 / 60;
            String s = "";
            if (cmin1 < 10){
                s = "0" + cmin1;
            } else {
                s = "" + cmin1;
            }
            if (csec1 < 10){
                s = s + ":0" + csec1;
            } else {
                s = s + ":" + csec1;
            }
            timer1.setText(s);
         
            //每次執行Thred1只會執行一次,必須靠延遲1秒後執行Handler來進行重複執行
            handler.postDelayed(thread1, 1000);
        }
    }
 
    // 第二個執行緒
    public class ClockThread2 extends Thread {
        public void run(){
            timesec2++;
            csec2 = timesec2 % 60;
            cmin2 = timesec2 / 60;
            String s = "";
            if (cmin2 < 10){
                s = "0" + cmin2;
            } else {
                s = "" + cmin2;
            }
            if (csec2 < 10){
                s = s + ":0" + csec2;
            } else {
                s = s + ":" + csec2;
            }
            timer2.setText(s);
            handler.postDelayed(thread2,1000);
        }
    }
 
    private OnClickListener listener = new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            switch(v.getId()){
            case R.id.start1:
                //開始
                handler.post(thread1);
                break;
            case R.id.stop1:
                //停止(移除呼叫執行緒)
                handler.removeCallbacks(thread1);
                break;
            case R.id.zero1:
                timesec1 = 0;
                timer1.setText("00:00");
                break;      
            case R.id.start2:
                handler.post(thread2);
                break;      
            case R.id.stop2:
                handler.removeCallbacks(thread2);
                break;  
            case R.id.zero2:
                timesec2 = 0;
                timer2.setText("00:00");
                break;      
            case R.id.end:
                finish();
                break;              
            }
        }
    };

}




註:
    一、對 Thread 程式完全陌生,找到一個寫法很簡潔的範例,因此將程式碼收藏下來以便於往後參考之用。
    二、程式碼來源


範例下載

2016年6月27日 星期一

以Intent啟動其它Activity


public class MainActivity extends Activity {

private EditText medtName, medtAge;
private Button mbtnOK;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

medtName = (EditText) findViewById(R.id.edtName);
medtAge = (EditText) findViewById(R.id.edtAge);
mbtnOK = (Button) findViewById(R.id.btnOK);

mbtnOK.setOnClickListener(mbtnOKOnClickListener);
}

private View.OnClickListener mbtnOKOnClickListener = new View.OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent it = new Intent(MainActivity.this, SecondActivity.class);

// it.putIntExtra("姓名", "John"); // 存入以「姓名」為鍵值的資料「John」
it.putExtra(getString(R.string.s_txtName), medtName.getText().toString());
it.putExtra(getString(R.string.s_txtAge), medtAge.getText().toString());

startActivity(it);
}
};
}

public class SecondActivity extends Activity {
private TextView mtxtName2, mtxtAge2;
private Button mbtnPrv;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
mtxtName2 = (TextView) findViewById(R.id.txtName2);
mtxtAge2 = (TextView) findViewById(R.id.txtAge2);
mbtnPrv = (Button) findViewById(R.id.btnPrv);
mbtnPrv.setOnClickListener(mbtnPrvOnClickListener);
Intent it = getIntent();
// it.getStringExtra("姓名"); 讀出名為「姓名」的 String 資料
// it.getIntExtra("年齡", 18); 讀出名為「年齡」的 Int 資料, 若沒有則傳回 18
String tmpName = it.getStringExtra(getString(R.string.s_txtName)); 
String tmpAge = it.getStringExtra(getString(R.string.s_txtAge));
mtxtName2.setText(getString(R.string.s_txtName) + tmpName);
mtxtAge2.setText(getString(R.string.s_txtAge) + tmpAge);
}
private View.OnClickListener mbtnPrvOnClickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
finish();
}
};

2016年6月26日 星期日

JSON 資料讀取簡易版


public class MainActivity extends Activity {

private Button mbtnOK;
private TextView mtxtR;
String uri = "http://mis.ndhu.edu.tw/android/json.php";

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

mbtnOK = (Button) findViewById(R.id.btnOK);
mtxtR = (TextView) findViewById(R.id.txtR);

mbtnOK.setOnClickListener(mbtnOKOnClickListener);
}

private View.OnClickListener mbtnOKOnClickListener = new View.OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
HttpGet httpGetRequest = new HttpGet(uri);
try {
HttpResponse httpResponse = new DefaultHttpClient().execute(httpGetRequest);
if (httpResponse.getStatusLine().getStatusCode() == 200) {
String result = EntityUtils.toString(httpResponse.getEntity(), HTTP.UTF_8);
JSONArray jsonarr = new JSONArray(result);
String TmpStr = "";
for (int i=0; i<jsonarr.length(); i++) {
JSONObject lib = jsonarr.getJSONObject(i);
TmpStr += getString(R.string.s_name) + lib.getString("name") + "\n";
TmpStr += getString(R.string.s_addr) + lib.getString("addr") + "\n\n" ;
}
mtxtR.setText(TmpStr);
}
} catch (Exception e) {
mtxtR.setText(e.getMessage());
}
}
};
}






2016年6月25日 星期六

JSON 讀取測試


public class MainActivity extends Activity {

private Button btnParse;
private ListView listResult;
String[] libAdd;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

btnParse = (Button) findViewById(R.id.btn_parse);
btnParse.setOnClickListener(btnOKOnClickListener);

listResult = (ListView) findViewById(R.id.list_result);

listResult.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView parent, View view, int position, long id) {
// TODO Auto-generated method stub
Toast.makeText(MainActivity.this, getString(R.string.Address) + libAdd[position],
Toast.LENGTH_LONG).show();
}
});
}

public View.OnClickListener btnOKOnClickListener = new View.OnClickListener() {

@Override
public void onClick(View v) {
String[] libName = parseJSONData(getJSONData());
ArrayAdapter listAdapter = new ArrayAdapter(
MainActivity.this,
android.R.layout.simple_expandable_list_item_1,
libName);
listResult.setAdapter(listAdapter);
}
};

private JSONArray getJSONData() {
String uri = "http://mis.ndhu.edu.tw/android/json.php";
HttpGet httpget = new HttpGet(uri);
try {
HttpResponse httprspns = getHttpclient().execute(httpget);
String result = EntityUtils.toString(httprspns.getEntity(), HTTP.UTF_8);
Log.e("result", result);
JSONArray jsonarr = new JSONArray(result);
return jsonarr;
} catch (Exception e) {
return null;
}
}

private String[] parseJSONData(JSONArray dataInput) {
try {
String[] libName = new String[dataInput.length()];
String[] libAddress = new String[dataInput.length()];
for (int i=0; i<dataInput.length(); i++) {
JSONObject lib = dataInput.getJSONObject(i);
Log.e("name", lib.getString("name"));
Log.e("addr", lib.getString("addr"));
libName[i] = lib.getString("name");
libAddress[i] = lib.getString("addr");
}
libAdd = libAddress;
return libName;
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
}

private DefaultHttpClient getHttpclient() {
HttpParams httpParameters = new BasicHttpParams();
int timeoutConnection = 5000;
HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection);
int timeoutSocket = 3000;
HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket);
DefaultHttpClient httpclient = new DefaultHttpClient(httpParameters);
return httpclient;
}

}




註:
  一、程式碼來源及教學參考此連結
  二、教學中的 Open Data 來源有問題,已把顯示相同格式的資料移至他處。


Http Post 參數傳遞


public class MainActivity extends Activity {

private EditText medtMessage;
private Button mbtnOK;
private TextView mtxtShow;
private String uri = "http://mis.ndhu.edu.tw/android/response_post_android.php";

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

medtMessage = (EditText)findViewById(R.id.edtMessage);
mbtnOK = (Button)findViewById(R.id.btnOK);
mtxtShow = (TextView) findViewById(R.id.txtShow);

mbtnOK.setOnClickListener(mbtnOKOnClickListener);
}

private View.OnClickListener mbtnOKOnClickListener = new View.OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub

HttpPost httpPostRequest = new HttpPost(uri);
List httpParams = new ArrayList();
httpParams.add(new BasicNameValuePair("name", medtMessage.getText().toString()));
try {
httpPostRequest.setEntity(new UrlEncodedFormEntity(httpParams, HTTP.UTF_8));
HttpResponse httpResponse =  new DefaultHttpClient().execute(httpPostRequest);
if (httpResponse.getStatusLine().getStatusCode() == 200) {
// String result = EntityUtils.toString(httpResponse.getEntity());  // 中文會亂碼
String result = EntityUtils.toString(httpResponse.getEntity(), HTTP.UTF_8);
// result = result.replaceAll("\r\n|\n\r|\r|\n", "");
mtxtShow.setText(result);
}
} catch (Exception e) {
mtxtShow.setText("連線錯誤:" + e.getMessage());
}

}
};

}






範例下載

再按一次返回鍵結束程式


public class MainActivity extends Activity {

//判斷離開的flag,設定成全域變數
private boolean is_exit = false;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
boolean returnValue = false;
if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0 && is_exit == false) {
Toast.makeText(getBaseContext(), getText(R.string.str_notice_ExitonDoubleKeyDown), Toast.LENGTH_SHORT).show();
is_exit = true;
// 一開始 先設定 返回的 flag = true ,若使用者兩秒內沒有動作,則將該 flag 恢復為 false
new Thread(new Runnable() {
public void run() {
try {
Thread.sleep(2000);
is_exit = false;
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}).start();
returnValue = true;
} else {
returnValue = super.onKeyDown(keyCode, event);
}
return returnValue;
}
}

註:程式碼來源由網路查得


下載範例

2016年6月19日 星期日

偵測螢幕解析度


public class MainActivity extends Activity {

private TextView mtxtX, mtxtY, mtxtDPI;
private Button mbtnOK;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

mtxtX = (TextView) findViewById(R.id.txtX);
mtxtY = (TextView) findViewById(R.id.txtY);
mtxtDPI = (TextView) findViewById(R.id.txtDPI);

mbtnOK = (Button) findViewById(R.id.btnOK);
mbtnOK.setOnClickListener(OnbtnOKClickCistener);
}

private View.OnClickListener OnbtnOKClickCistener = new View.OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub

// 手機的寬度(像素)
 int mWidth = getResources().getDisplayMetrics().widthPixels;
 // 手機的高度(像素)
int mHeight = getResources().getDisplayMetrics().heightPixels;
// 手機的DPI
float mDpi = getResources().getDisplayMetrics().densityDpi;

mtxtX.setText(getString(R.string.S_txtX) + Integer.toString(mWidth));
mtxtY.setText(getString(R.string.S_txtY) + Integer.toString(mHeight));
mtxtDPI.setText(getString(R.string.S_txtDPI) + Float.toString(mDpi));
}
};

}






範例程式