在Android的应用中,往往需要在执行主界面的操作时,如果要执行耗时的操作,那么应该是另外开线程的,或者是用async或者handler,今天发现其实也可以用android中的一个Intentservice去实现。下面例子讲解下。
1 例子中是一个文本框,当用户输入内容后,模拟slepp 10秒,这个时候要是不分离线程,操作的话,用户再点界面,就会死死地停在那里,甚至是出现提示,要强行CLOSE,代码如下:
1. EditText input = (EditText) findViewById(R.id.txt_input);
2. String strInputMsg = input.getText().toString();
3. 30000); // 30 seconds, pretend to do work TextView result = (TextView) findViewById(R.id.txt_result); result.setText(strInputMsg + " " + DateFormat.format("MM/dd/yy h:mmaa", System.currentTimeMillis()));
EditText input = (EditText) findViewById(R.id.txt_input);
String strInputMsg = input.getText().toString();
SystemClock.sleep(30000); // 30 seconds, pretend to do work TextView result = (TextView) findViewById(R.id.txt_result); result.setText(strInputMsg + " " + DateFormat.format("MM/dd/yy h:mmaa", System.currentTimeMillis()));
2 下面是使用IntentService
首先,我们搞一个类SimpleIntentService,继承了IntentService
1. public class SimpleIntentService extends
2. public static final String PARAM_IN_MSG = "imsg";
3. public static final String PARAM_OUT_MSG = "omsg";
4.
5. public
6. super("SimpleIntentService");
7. }
8.
9. @Override
10. protected void
11.
12. String msg = intent.getStringExtra(PARAM_IN_MSG);
13. 3000); // 30 seconds
14. " "
15. "MM/dd/yy h:mmaa", System.currentTimeMillis());
16. "SimpleIntentService", "Handling msg: "
17.
18. new
19. broadcastIntent.setAction(ResponseReceiver.ACTION_RESP);
20. broadcastIntent.addCategory(Intent.CATEGORY_DEFAULT);
21. broadcastIntent.putExtra(PARAM_OUT_MSG, resultTxt);
22. sendBroadcast(broadcastIntent);
23. }
public class SimpleIntentService extends IntentService {
public static final String PARAM_IN_MSG = "imsg";
public static final String PARAM_OUT_MSG = "omsg";
public SimpleIntentService() {
super("SimpleIntentService");
}
@Override
protected void onHandleIntent(Intent intent) {
String msg = intent.getStringExtra(PARAM_IN_MSG);
SystemClock.sleep(3000); // 30 seconds
String resultTxt = msg + " "
+ DateFormat.format("MM/dd/yy h:mmaa", System.currentTimeMillis());
Log.v("SimpleIntentService", "Handling msg: " + resultTxt);
Intent broadcastIntent = new Intent();
broadcastIntent.setAction(ResponseReceiver.ACTION_RESP);
broadcastIntent.addCategory(Intent.CATEGORY_DEFAULT);
broadcastIntent.putExtra(PARAM_OUT_MSG, resultTxt);
sendBroadcast(broadcastIntent);
}
我们将跟主界面线程分离的操作都写在这里的ononHandleIntent中,这里首先通过
主线程传递的Intent中,获得用户文本框中输入的内容,放到变量msg中,然后
又建立一个Intent,把结果放到这个Intent中去,然后再sendBroadcast(broadcastIntent)广播出去,丢回给主线程。
3 在主线程中,这样启动:
1. EditText input = (EditText) findViewById(R.id.txt_input);
2. String strInputMsg = input.getText().toString();
3.
4. new Intent(this, SimpleIntentService.class);
5. msgIntent.putExtra(SimpleIntentService.PARAM_IN_MSG, strInputMsg);
6. startService(msgIntent);
EditText input = (EditText) findViewById(R.id.txt_input);
String strInputMsg = input.getText().toString();
Intent msgIntent = new Intent(this, SimpleIntentService.class);
msgIntent.putExtra(SimpleIntentService.PARAM_IN_MSG, strInputMsg);
startService(msgIntent);
4 同时,在主线程中,也要有一个receive接收
1. public class ResponseReceiver extends
2. public static final String ACTION_RESP = "com.mamlambo.intent.action.MESSAGE_PROCESSED";
3. @Override
4. public void
5.
6. // Update UI, new "message" processed by SimpleIntentService
7. TextView result = (TextView) findViewById(R.id.txt_result);
8. String text = intent.getStringExtra(SimpleIntentService.PARAM_OUT_MSG);
9. result.setText(text);
10. }
11.
12. }
13.
14.
public class ResponseReceiver extends BroadcastReceiver {
public static final String ACTION_RESP = "com.mamlambo.intent.action.MESSAGE_PROCESSED";
@Override
public void onReceive(Context context, Intent intent) {
// Update UI, new "message" processed by SimpleIntentService
TextView result = (TextView) findViewById(R.id.txt_result);
String text = intent.getStringExtra(SimpleIntentService.PARAM_OUT_MSG);
result.setText(text);
}
}
当然,要注册这个broadcastReceiver,
1. public void
2. super.onCreate(savedInstanceState);
3. setContentView(R.layout.main);
4.
5. new
6. filter.addCategory(Intent.CATEGORY_DEFAULT);
7. new
8. registerReceiver(receiver, filter);
9. }
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
IntentFilter filter = new IntentFilter(ResponseReceiver.ACTION_RESP);
filter.addCategory(Intent.CATEGORY_DEFAULT);
receiver = new ResponseReceiver();
registerReceiver(receiver, filter);
}
可以看到,intent service还是比较清晰简单的,但至于性能方面,还是要继续学习,
迟点继续研究下这玩意哦