自定義異步任務
自定義ThreadHelper類,利用AsyncTask,使用時通過回調進行異步操作。
ThreadHelper工具類
import java.io.Serializable;
import android.os.AsyncTask;
public class ThreadHelper {
private static ThreadHelper util;
public static ThreadHelper getInstance() {
if (util == null) {
util = new ThreadHelper();
}
return util;
}
private ThreadHelper() {
super();
}
public void runAsync(ThreadCallBack tcb) {
new ThreadAsync().execute(tcb);
}
public class ThreadAsync extends AsyncTask<Object, Integer, Object> {
ThreadCallBack tcb;
@Override
protected Object doInBackground(Object... tc) {
if (tc != null && tc.length > 0) {
tcb = (ThreadCallBack) tc[0];
return tcb.run(this);
}
return null;
}
@Override
protected void onPostExecute(Object result) {
super.onPostExecute(result);
if (tcb != null) {
tcb.result((Serializable) result);
}
}
public void progress(Integer... values) {
publishProgress(values);
}
@Override
public void onProgressUpdate(Integer... values) {
// TODO Auto-generated method stub
super.onProgressUpdate(values);
if (tcb != null) {
tcb.progress(values);
}
}
}
public interface ThreadCallBack {
void progress(Integer... values);
Object run(ThreadAsync at);
void result(Object result);
}
public boolean isServiceRunning(Context context,Class cl) {
boolean isRunning = false;
ActivityManager activityManager =
(ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningServiceInfo> serviceList
= activityManager.getRunningServices(Integer.MAX_VALUE);
if (serviceList == null || serviceList.size() == 0) {
return false;
}
for (int i = 0; i < serviceList.size(); i++) {
if (serviceList.get(i).service.getClassName().equals(cl.getName())) {
isRunning = true;
break;
}
}
return isRunning;
}
public boolean isRunBackground(Context context) {
ActivityManager activityManager = (ActivityManager) context
.getSystemService(Context.ACTIVITY_SERVICE);
List<RunningAppProcessInfo> appProcesses = activityManager
.getRunningAppProcesses();
for (RunningAppProcessInfo appProcess : appProcesses) {
if (appProcess.processName.equals(context.getPackageName())) {
if (appProcess.importance == RunningAppProcessInfo.IMPORTANCE_BACKGROUND) {
return true;
} else {
return false;
}
}
}
return false;
}
}
使用方法
ThreadHelper.getInstance().runAsync(new ThreadCallBack() {
/*
* 後臺操作
*/
@Override
public Object run(ThreadAsync at) {
// 這句會跳轉到progress(Integer... values)中
at.progress(6);
try {
URL url = new URL("http://www.baidu.com");
HttpURLConnection hc = (HttpURLConnection) url
.openConnection();
at.progress(10);
hc.setConnectTimeout(45000);
hc.setInstanceFollowRedirects(false);
hc.setDoInput(true);
InputStream stream = hc.getInputStream();
StringBuffer sb = new StringBuffer();
at.progress(20);
try {
BufferedReader br = new BufferedReader(
new InputStreamReader(stream, "GBK"));
String temp = "";
while ((temp = br.readLine()) != null) {
sb.append(temp);
}
at.progress(40);
} catch (Exception e) {
e.printStackTrace();
}
return sb.toString();
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
/*
* 操作結果,在主線程中處理
*/
@Override
public void result(Object result) {
if (result != null) {
System.out.println(result.toString());
}
}
/*
* 在後臺任務中傳過來的進度
*/
@Override
public void progress(Integer... values) {
Toast.makeText(getApplicationContext(), "當前進度" + values[0],
Toast.LENGTH_SHORT).show();
setProgress(values[0] * 100);
}
});