当前位置:  编程技术>移动开发
本页文章导读:
    ▪Handler应用入门        Handler使用入门 本讲内容:Handler使用入门 当用户点击一个按钮时如果执行的是一个常耗时操作的话,处理不好会导致系统假死,用户体验很差,而Android则更进一步,如果任意一个Acitivity.........
    ▪ debug初记        debug小记   编程难免有bug,一些隐蔽的bug往往让人比较烦恼,初学者更是如此,俺经过亲身经历,整理了一些debug的小技巧,希望对初学者有所帮助,高手拍砖也欢迎哈 1.最常用的肯定是NSLog了,可以.........
    ▪ 处置 选择camera gallery 文件夹文件浏览       处理 选择camera gallery 文件夹文件浏览 不同手机拍照之后的保存路径不一样 没有找到合适的 目前 我的做法是 文件浏览 然后在找 有更好的解决办法希望跟帖谢谢 package com.fileUpload;   import ja.........

[1]Handler应用入门
    来源: 互联网  发布时间: 2014-02-18
Handler使用入门
本讲内容:Handler使用入门

当用户点击一个按钮时如果执行的是一个常耗时操作的话,处理不好会导致系统假死,用户体验很差,而Android则更进一步,如果任意一个Acitivity没有响应5秒钟以上就会被强制关闭,因此我们需要另外起动一个线程来处理长耗时操作,而主线程则不受其影响,在耗时操作完结发送消息给主线程,主线程再做相应处理。那么线程之间的消息传递和异步处理用的就是Handler。

下面我们通过一个模拟文件下载的这个长耗时操作来做个说明:

1、新建一个项目 Lesson27_Handler

2、在MainHandler.java中写如下面内容:

view sourceprint?01 package android.basic.lesson27; 

02   

03 import android.app.Activity; 

04 import android.app.ProgressDialog; 

05 import android.content.res.Resources; 

06 import android.os.Bundle; 

07 import android.os.Handler; 

08 import android.os.Message; 

09 import android.util.Log; 

10 import android.view.View; 

11 import android.widget.Button; 

12   

13 public class MainHandler extends Activity { 

14   

15     //声明变量 

16     private Button b1; 

17     private ProgressDialog pd; 

18   

19     //定义Handler对象 

20     private Handler handler =new Handler(){ 

21         @Override

22         //当有消息发送出来的时候就执行Handler的这个方法 

23         public void handleMessage(Message msg){ 

24             super.handleMessage(msg); 

25             //只要执行到这里就关闭对话框 

26             pd.dismiss(); 

27         } 

28     }; 

29   

30     /** Called when the activity is first created. */

31     @Override

32     public void onCreate(Bundle savedInstanceState) { 

33         super.onCreate(savedInstanceState); 

34         setContentView(R.layout.main); 

35   

36         Resources res=  this.getResources(); 

37         //查看UI组件所在的线程名 

38         Log.i("tag", "onCreate()-->"+Thread.currentThread().getName()); 

39   

40         //定义UI组件 

41         b1= (Button)findViewById(R.id.Button01); 

42         //给按钮绑定单击事件监听器 

43         b1.setOnClickListener(new View.OnClickListener() { 

44   

45             @Override

46             public void onClick(View v) { 

47                 //点击按钮后去处理长耗时操作 

48                 processThread(); 

49             } 

50         }); 

51     } 

52   

53     private void processThread(){ 

54   

55         //构建一个下载进度条 

56         pd= ProgressDialog.show(MainHandler.this, "下载文件", "正在下载……"); 

57         Log.i("tag", "processThread()-->"+Thread.currentThread().getName()); 

58   

59         new Thread(){ 

60   

61             @Override

62             public void run(){ 

63                 Log.i("tag", "run()-->"+Thread.currentThread().getName()); 

64                 //在新线程里执行长耗时方法 

65                 longTimeMethod(); 

66                 //执行完毕后给handler发送一个空消息 

67                 handler.sendEmptyMessage(0); 

68             } 

69   

70         }.start(); 

71     } 

72   

73     //模拟下载文件的长耗时方法 

74     private void longTimeMethod(){ 

75         try { 

76             Log.i("tag", "longTimeMethod-->"+Thread.currentThread().getName()); 

77             Thread.sleep(10000); 

78         } catch (InterruptedException e) { 

79             e.printStackTrace(); 

80         } 

81     } 

82 }

3、res/layout/main.xml的内容就省略了,你们可以根据程序运行截图和程序代码反推出来布局组件。

4、运行程序查看结果:

这个例子里,在辅助线程的run方法中执行长耗时操作,操作完毕后调用handler.sendEmptyMessage()方法,主线程中的Handler的 handleMessage()方法接受到这一消息,并做了就是关闭对话框的处理。

在接下来的例子里,让我们处理一些更复杂的操作来理解和练习Handler的使用方法。

(待续)



    
[2] debug初记
    来源: 互联网  发布时间: 2014-02-18
debug小记

  编程难免有bug,一些隐蔽的bug往往让人比较烦恼,初学者更是如此,俺经过亲身经历,整理了一些debug的小技巧,希望对初学者有所帮助,高手拍砖也欢迎哈

1.最常用的肯定是NSLog了,可以查看各种变量在各个状态的值,而且对于程序流程的整理也很有帮助

2.单步调试,一般鼠标悬浮在变量上就可以快速查看变量的状态,俺一般看这个变量的地址,就是0x开头的,主要是看它是否为nil,nil的地址是0x0,字符串可以看具体值,而字典和数组却只显示count,即有多少个元素或键值对,如果要查看整个数组或字典的话,此时是不行的(呵呵,方法在后面)

俺主要想说的其实是后面这几点,呵呵

3.debuger在单步调试的时候会出现,三部分,俺初学的时候只用下面的单步调试,直观快捷



3-1.后来发现:有个比较快捷的方法查看数组和字典,右上角的窗口里,有Arguments和locals(俺常用),在Arguments的self或loacls里有你想查看的数组的话,选中它,右键菜单上有print description to console,可以很方便的在console里查看数组和字典的值,当然像文件夹路径这种长字符串更不在话下了

3-2.左上角的窗口以前看上去好复杂,虽然现在看还是复杂,但俺看出了点门道,特别是在interrupt的时候,报错状态下,左上角的第一行显示????,其实左上角是倒序显示的,就是说最后执行的语句是在第一句,而已经执行的是显示在下面,有的时候,???下面有一些是显示"方法的调用",即[object message],这很关键,可以找到距离报错的地点最近的地方,经过俺的实践,常常就是在那解决bug的

4.也是在报错状态,console一般会显示错误信息,常见的unregnise selector这些看多了也就熟悉了,有的时候会显示Call stack at first throw这种也是倒着看,先执行的在下面显示,定位到离错误最近的地方解决bug,如:

2010-10-16 20:14:13.633 Universiade 2011[5293:207] *** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<MoreSecondViewController_ser 0x6d49bf0> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key mytableView.'
*** Call stack at first throw:
(
	0   CoreFoundation                      0x0264db99 __exceptionPreprocess + 185
	1   libobjc.A.dylib                     0x0279d40e objc_exception_throw + 47
	2   CoreFoundation                      0x0264dad1 -[NSException raise] + 17
	3   Foundation                          0x0008a0f3 _NSSetUsingKeyValueSetter + 135
	4   Foundation                          0x0008a061 -[NSObject(NSKeyValueCoding) setValue:forKey:] + 285
	5   UIKit                               0x0050870a -[UIRuntimeOutletConnection connect] + 112
	6   CoreFoundation                      0x025c3d0f -[NSArray makeObjectsPerformSelector:] + 239
	7   UIKit                               0x00507121 -[UINib instantiateWithOwner:options:] + 1041
	8   UIKit                               0x00508eb5 -[NSBundle(UINSBundleAdditions) loadNibNamed:owner:options:] + 168
	9   UIKit                               0x003be95f -[UIViewController _loadViewFromNibNamed:bundle:] + 70
	10  UIKit                               0x003bc675 -[UIViewController loadView] + 120
	11  UIKit                               0x003bc54f -[UIViewController view] + 56
	12  UIKit                               0x003ba9f4 -[UIViewController contentScrollView] + 42
	13  UIKit                               0x003ca7e2 -[UINavigationController _computeAndApplyScrollContentInsetDeltaForViewController:] + 48
	14  UIKit                               0x003c8ea3 -[UINavigationController _layoutViewController:] + 43
	15  UIKit                               0x003ca067 -[UINavigationController _startTransition:fromViewController:toViewController:] + 326
	16  UIKit                               0x003c4ccd -[UINavigationController _startDeferredTransitionIfNeeded] + 266
	17  UIKit                               0x003cbd8b -[UINavigationController pushViewController:transition:forceImmediate:] + 876
	18  UIKit                               0x003c4b67 -[UINavigationController pushViewController:animated:] + 62
	19  Universiade 2011                    0x0002a82e -[MoreTableView tableView:didSelectRowAtIndexPath:] + 1050
	20  UIKit                               0x00385a48 -[UITableView _selectRowAtIndexPath:animated:scrollPosition:notifyDelegate:] + 1140
	21  UIKit                               0x0037c32e -[UITableView _userSelectRowAtIndexPath:] + 219
	22  Foundation                          0x0009121a __NSFireDelayedPerform + 441
	23  CoreFoundation                      0x0262ef73 __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 19
	24  CoreFoundation                      0x026305b4 __CFRunLoopDoTimer + 1364
	25  CoreFoundation                      0x0258cdd9 __CFRunLoopRun + 1817
	26  CoreFoundation                      0x0258c350 CFRunLoopRunSpecific + 208
	27  CoreFoundation                      0x0258c271 CFRunLoopRunInMode + 97
	28  GraphicsServices                    0x02f2c00c GSEventRunModal + 217
	29  GraphicsServices                    0x02f2c0d1 GSEventRun + 115
	30  UIKit                               0x00320af2 UIApplicationMain + 1160
	31  Universiade 2011                    0x00002a5c main + 102
	32  Universiade 2011                    0x000029ed start + 53
)
terminate called after throwing an instance of 'NSException'
Program received signal:  “SIGABRT”.
 

5.比较恼火的BAD_ACCESS,网上有个做法是设置ZomebieEnabled,确实不错,有的时候确不显示(不知道是不是人品问题..)

不显示的时候用俺刚才说的debuger左上角的定位至离错误最近的地方那个方法,一般都OK了

  吾生有涯,debug无涯,未完待续

 


    
[3] 处置 选择camera gallery 文件夹文件浏览
    来源: 互联网  发布时间: 2014-02-18
处理 选择camera gallery 文件夹文件浏览

不同手机拍照之后的保存路径不一样

没有找到合适的 目前 我的做法是 文件浏览 然后在找 有更好的解决办法希望跟帖谢谢

package com.fileUpload;

  import java.io.File;
  import java.util.ArrayList;
  import java.util.List;
  import android.app.AlertDialog;
  import android.app.ListActivity;
  import android.content.DialogInterface;
  import android.content.Intent;
  import android.os.Bundle;
  import android.view.View;
  import android.widget.ArrayAdapter;
  import android.widget.ListView;
  import android.widget.TextView;

  public class FileExplorer extends ListActivity {

  private List<String> item = null;
  private List<String> path = null;
  private String root="/";
  private TextView myPath;

  /** Called when the activity is first created. */
  @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.file);
    myPath = (TextView)findViewById(R.id.path);
    getDir(root);
}

private void getDir(String dirPath)
{
 myPath.setText("Location: " + dirPath);

 item = new ArrayList<String>();
 path = new ArrayList<String>();

 File f = new File(dirPath);
 File[] files = f.listFiles();

 if(!dirPath.equals(root))
 {

  item.add(root);
  path.add(root);

  item.add("../");
  path.add(f.getParent());

 }

 for(int i=0; i < files.length; i++)
 {
   File file = files[i];
   path.add(file.getPath());
   if(file.isDirectory())
    item.add(file.getName() + "/");
   else
    item.add(file.getName());
 }

 ArrayAdapter<String> fileList =
  new ArrayAdapter<Stringbackground-color: transparent; margin: 0px; color: black; font-size: 14px; vertical-align: baselin
 


    
最新技术文章:
▪Android开发之登录验证实例教程
▪Android开发之注册登录方法示例
▪Android获取手机SIM卡运营商信息的方法
▪Android实现将已发送的短信写入短信数据库的...
▪Android发送短信功能代码
▪Android根据电话号码获得联系人头像实例代码
▪Android中GPS定位的用法实例
▪Android实现退出时关闭所有Activity的方法
▪Android实现文件的分割和组装
▪Android录音应用实例教程
▪Android双击返回键退出程序的实现方法
▪Android实现侦听电池状态显示、电量及充电动...
▪Android获取当前已连接的wifi信号强度的方法
▪Android实现动态显示或隐藏密码输入框的内容
▪根据USER-AGENT判断手机类型并跳转到相应的app...
▪Android Touch事件分发过程详解
▪Android中实现为TextView添加多个可点击的文本
▪Android程序设计之AIDL实例详解
▪Android显式启动与隐式启动Activity的区别介绍
▪Android按钮单击事件的四种常用写法总结
▪Android消息处理机制Looper和Handler详解
▪Android实现Back功能代码片段总结
▪Android实用的代码片段 常用代码总结
▪Android实现弹出键盘的方法
▪Android中通过view方式获取当前Activity的屏幕截...
▪Android提高之自定义Menu(TabMenu)实现方法
▪Android提高之多方向抽屉实现方法
▪Android提高之MediaPlayer播放网络音频的实现方法...
▪Android提高之MediaPlayer播放网络视频的实现方法...
▪Android提高之手游转电视游戏的模拟操控
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3