小场景
hi,今天有个小功能,需要ping<ip>,我就google了一下,就找到了一个工具类,然后我就加工了一下。
String resault = "";
Process p;
try {
p = Runtime.getRuntime().exec("ping " + str);
int status = p.waitFor();
InputStream input = p.getInputStream();
BufferedReader in = new BufferedReader(new InputStreamReader(input));
StringBuffer buffer = new StringBuffer();
String line = "";
while ((line = in.readLine()) != null){
buffer.append(line+"\n");
}
Log.d("Return ============" ,buffer.toString());
if (status == 0) {
resault = "success";
} else {
resault = "faild";
}
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
return resault;
}
那我该怎么用呢?考虑到这个是一个耗时操作,我就想到了AsyncTask,先看一个刚入门Android的笔记吧。
http://note.youdao.com/noteshare?id=a640bf4dff6df5712c00318dcfadfc74&sub=E8B32F6E92F844E88284B409FAA17B18
使用
第一,继承AsyncTack
//在子线程运行,执行加载,不能更新UI
@Override
protected String doInBackground(String... params) {
Log.d(TAG, "doInBackground: ping");
//执行这个才会调用onPregressUpdate去更新UI,要放到耗时长的方法前面
publishProgress("pinging...");
String s = "";
s = PingUtil.Ping(params[0]);
Log.d("ping", s);
return s;
}
//执行后台任务时更新UI
@Override
protected void onProgressUpdate(String... values) {
super.onProgressUpdate(values);
Log.d(TAG, "onProgressUpdate: ping "+values[0]);
mPingPref.setSummary(values[0]);
}
//任务执行后的回调
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
Log.d(TAG, "onPostExecute:ping "+s);
mPingPref.setSummary(s);
}
//任务被取消的回调
@Override
protected void onCancelled() {
super.onCancelled();
Log.d(TAG, "onCancelled: ping");
mPingPref.setSummary("");
}
}
安全方法
未防止内存泄漏,第一 AsyncTask设置为静态类
第二,在Activity生命结束前,若任务还没有执行完,将任务cancel掉。
protected void onDestroy() {
super.onDestroy();
if (mNetPing!=null && !mNetPing.isCancelled()){
mNetPing.cancel(true);
}
}
碎碎念
就这样啦,如果这里有不妥之处,请指出,大家一起进步,gogogo。
网友评论