android UI之button异步处理

本文介绍了一种在Android应用中优化UI线程的方法,通过创建独立的处理线程来避免阻塞UI线程,特别是在涉及数据库操作或网络数据请求时。文章提供了一个具体的示例,展示了如何使用Handler和Thread来实现异步任务处理。
摘要由CSDN通过智能技术生成

在做界面时候,我们经常用到button,但是好多时候我们直接把响应事件写在在了Onclick函数里面。但是这样做的坏处就是占用了ui线程。如果是请求数据库或者是进行网络数据请求,那么这样做可能会有点得不偿失。

Button testButton = new Button(this);

testButton .setOnClickListener(new OnclickListener(){
           public void onClick(View view){

                // do something

           }
        });

所以在UI处理的时候,我们应该尽量做到异步处理。也就是起我们自己的处理线程。

import android.content.*;
import android.graphics.*;
import android.net.*;
import android.os.Handler;
import android.os.Message;
import android.view.*;
import android.widget.*;

import com.sc.lib.Base64;
import com.sc.lib.ui.BusyDialog;
import com.sc.netvision.TopCommander;
import com.sc.netvision.Utils;
import com.sc.netvision.xml.*;

public class videoPlay extends LinearLayout implements
          Runnable ,View.OnClickListener{
    private VideoView mPlayer = null;
    private String path = null;
    private Button playButton = null;
    private BusyDialog dlgBusy = null;
 private final int FAILCONNECTSERVER = 1;
 private final int PLAYMEDIAVIEW = 20;
 
    public ClipVideoPlay( Context context, String loadPath) {
 
  super(context);
  initial( context);
  path = loadPaht;
  
 }
  private Handler  uiHandler = new Handler()  {
 
  public void handleMessage(Message msg) {
   try {
    switch (msg.what) {
     case FAILCONNECTSERVER:
      Toast.makeText(currentContext, "Can not connect to server",
               Toast.LENGTH_SHORT).show();
      break;     
     case PLAYMEDIAVIEW:
      playMedia(currentContext);
     default:
      super.handleMessage(msg);
      break;
    }
   } finally {
    dlgBusy.cancel();
   }
  }
 };
    public void onClick(View view) {
     // TODO Auto-generated method stub
     isPlay = false;
     if(view == playButton) {
      dlgBusy = BusyDialog.showBusyDialog(currentContext, "Please wait", "Returning ...");
      new Thread(this).start();
     }
    }
 
    public void run() {
     // TODO Auto-generated method stub
     Message msg = new Message();  
  try {
  
   msg.what = PLAYMEDIAVIEW; 
  
  } finally {
   
   uiHandler.sendMessage(msg);
  }   
    }
   private void initial( Context context) {
 
   setOrientation(VERTICAL);
  currentContext = context;
  clipList = clips;
  deviceName = devName;
  
  
  playButton = new Button(context);
  playButton.setOnClickListener(this);     
  path = URL;
  mPlayer = new VideoView(context);
  
  addView(playButton,new LinearLayout.LayoutParams(
      LinearLayout.LayoutParams.FILL_PARENT,
      LinearLayout.LayoutParams.WRAP_CONTENT));
  addView(addPlayTitle(context));
  addView(mPlayer,new LinearLayout.LayoutParams(
      LinearLayout.LayoutParams.FILL_PARENT,
      LinearLayout.LayoutParams.FILL_PARENT));
  setGravity(Gravity.CENTER);      
 }
  
   
 private void playMedia(Context context) {
   String uriPath = path ;
  Uri uri = Uri.parse(uriPath);
  MediaController controller = new MediaController(context);
  controller.show();
  mPlayer.setMediaController(controller);
  mPlayer.setVideoURI(uri);
  mPlayer.requestFocus();
  mPlayer.start();
    }

}

代码不能直接运行。 但是思想是这个思想。另起一个线程去获取网络数据,进行播放。这样可以快速响应事件。

转载于:https://my.oschina.net/u/138169/blog/16692

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值