編輯:關於Android編程
一定要加上對Sd卡讀寫文件的權限聲明,以及訪問網絡的權限
復制代碼 代碼如下:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
get /post 工具
復制代碼 代碼如下:
package com.act262.whpj.utils;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.util.Date;
import android.os.Environment;
import android.util.PrintStreamPrinter;
/**
* 用於get或者post數據
*/
public class GetPostUtil {
public static final String TAG = "GetPostUtil Debug";
/**
* @param url
* 傳入的url,包括了查詢參數
* @return 返回get後的數據
*/
public static String sendGet(String url) {
String result = "";
// String
URL realURL = null;
URLConnection conn = null;
BufferedReader bufReader = null;
String line = "";
try {
realURL = new URL(url);
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("url 格式錯誤");
}
try {
conn = realURL.openConnection();
// 設置連接參數...conn.setRequestProperty("xx", "xx");
conn.setConnectTimeout(10000); // 10s timeout
// conn.setRequestProperty("accept", "*/*");
// conn.setRequestProperty("", "");
conn.connect(); // 連接就把參數送出去了 get方法
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("連接錯誤");
}
try {
bufReader = new BufferedReader(new InputStreamReader(
conn.getInputStream(), "gb2312"));
while ((line = bufReader.readLine()) != null) {
result += line + "\n";
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("讀取數據錯誤");
} finally {
// 釋放資源
if (bufReader != null) {
try {
bufReader.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
return result;
}
/**
* @param url
* @param param
* 查詢參數 ,形式如 name=xx&age=xx&sex=xx
* @return
*/
public static String sendGet(String url, String param) {
return sendGet(url + "?" + param);
}
/**
* @param url
* 指定的url,不包括查詢參數
* @param param
* 查詢參數 形式如 name=xx&age=xx&sex=xx
* @return 返回post後的數據
*/
public static String sendPost(String url, String param) {
String result = "";
URL realURL = null;
BufferedReader bufReader = null;
// PrintWriter printWriter = null;
PrintStreamPrinter out = null;
URLConnection connection = null;
String line = "";
try {
realURL = new URL(url);
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
connection = realURL.openConnection();
// 設置為可輸入輸出 post的模式,而且在輸出之前不能獲取輸入的數據,否則報錯
connection.setDoOutput(true);
connection.setDoOutput(true);
// 已經連接了,所以不能再用connect(),否則報錯的
out = new PrintStreamPrinter(new PrintStream(
connection.getOutputStream()));
out.println(param);
//
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
bufReader = new BufferedReader(new InputStreamReader(
connection.getInputStream(), "gb2312"));
while ((line = bufReader.readLine()) != null) {
result += line + "\n";
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
// 釋放資源
try {
if (bufReader != null) {
bufReader.close();
}
if (out != null) {
//
}
} catch (IOException e2) {
// TODO: handle exception
}
}
return result;
}
public static void saveFile(String content) {
File file = new File(Environment.getExternalStorageDirectory()
.getAbsolutePath(), "file.html");
if (!file.exists()) {
try {
boolean status = file.createNewFile();
System.out.println("is create new file :" + status);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
PrintWriter pw = null;
try {
FileWriter fw = new FileWriter(file);
// pw = new PrintWriter(new Date() + ".html");
// pw.println(content);
fw.write(content);
fw.flush();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
if (pw != null) {
pw.close();
}
}
}
}
測試類
復制代碼 代碼如下:
package com.act262.whpj.ui;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import com.act262.whpj.R;
import com.act262.whpj.utils.GetPostUtil;
public class StartActivity extends Activity {
Button get, post;
TextView showTextView;
Handler handler;
String result = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_start);
get = (Button) findViewById(R.id.get);
post = (Button) findViewById(R.id.post);
showTextView = (TextView) findViewById(R.id.show);
handler = new Handler() {
public void handleMessage(Message msg) {
if (msg.what == 0x123) {
showTextView.setText(result);
}
}
};
post.setOnClickListener(new ButtonListener());
get.setOnClickListener(new ButtonListener());
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.start, menu);
return true;
}
class ButtonListener implements OnClickListener {
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.get:
new Thread() {
public void run() {
result = GetPostUtil
.sendGet("http://www.baidu.com");
handler.sendEmptyMessage(0x123);// 通知UI線程更新界面
// Log.d(GetPostUtil.TAG, result);
System.out.println(result);
GetPostUtil.saveFile(result);
}
}.start();
showTextView.setText(result);
break;
case R.id.post:
new Thread() {
public void run() {
result = GetPostUtil
.sendPost(
"http://www.baidu.com",
"null");
handler.sendEmptyMessage(0x123);// 通知UI線程更新界面
Log.d(GetPostUtil.TAG, result);
}
}.start();
showTextView.setText(result);
break;
default:
break;
}
}
}
}
在android中,LayoutInflater有點類似於Activity的findViewById(id),不同的是LayoutInflater是用來找layout下的
TabHost組件可以在界面中存放多個選項卡, 很多軟件都使用了改組件進行設計。一、基礎知識TabWidget : 該組件就是TabHost標簽頁中上部 或者 下部的按鈕
前言新版本ShareSDK的分享和短信驗證,按官網的文檔,都需要添加一個標簽,而分享和短息驗證的這個標簽內容都一樣。會沖突。解決辦法:分享用舊版本,短信驗證用新版本。後面
引子作為程序員,借鑒可能是工作中所必須碰到的事情,程序員的世界裡,更多的不是從無到有,而是從有到優。那麼當我們在做一些需求或者架構調整時,可能需要參考別的成熟公司的做法,