zoukankan      html  css  js  c++  java
  • Android开发中IntentService的使用(二)

    在Android的应用中,往往需要在执行主界面的操作时,如果要执行耗时的操作,那么应该是另外开线程的,或者是用async或者handler,今天发现其实也可以用android中的一个Intentservice去实现。下面例子讲解下。

    1 例子中是一个文本框,当用户输入内容后,模拟slepp 10秒,这个时候要是不分离线程,操作的话,用户再点界面,就会死死地停在那里,甚至是出现提示,要强行CLOSE,代码如下:
    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

    publicclass SimpleIntentService extends IntentService { 
    
    publicstaticfinal String PARAM_IN_MSG = "imsg"; 
    
    publicstaticfinal String PARAM_OUT_MSG = "omsg"; 
    
    public SimpleIntentService() { 
    
    super("SimpleIntentService"); 
    
    } 
    
    @Override
    
    protectedvoid 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 在主线程中,这样启动:

    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接收

    publicclass ResponseReceiver extends BroadcastReceiver { 
    
    publicstaticfinal String ACTION_RESP = "com.mamlambo.intent.action.MESSAGE_PROCESSED"; 
    
    @Override
    
    publicvoid 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,

    publicvoid 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还是比较清晰简单的,但至于性能方面,还是要继续学习,
    迟点继续研究下这玩意哦

  • 相关阅读:
    洛谷P3233 世界树
    线性基
    CF321E Ciel and Gondolas
    洛谷P2619 Tree I
    重温一下基本数据类型以及自动提升数据类型的问题
    不可理喻的JSTL标签库
    理解RESTful架构(转)
    Node.js的优点和缺点(转载)
    自制双色球随机号码
    编程, 细心永远都不嫌多(记录java连接数据库的一个错误)
  • 原文地址:https://www.cnblogs.com/xuewater/p/2591528.html
Copyright © 2011-2022 走看看