android 返回布局View

话说xml布局就是view?不理解:

三种方式可以生成LayoutInflater:

LayoutInflater inflater=LayoutInflater.from(this);
LayoutInflater inflater=getLayoutInflater();
LayoutInflater inflater=(LayoutInflater) this.getSystemService(LAYOUT_INFLATER_SERVICE);

然后调用inflate方法将xml布局文件转成View   

public View inflate(intresource,ViewGrouproot,booleanattachToRoot)
//在View类中,也有inflate方法
public static View inflate(Contextcontext,intresource,ViewGrouproot)

 

android控制软键盘弹出或者隐藏

在程序中加入以下代码时,软键盘会出现:

InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
imm.toggleSoftInput(0, InputMethodManager.RESULT_SHOWN);

如果要让软键盘消失,则为以下代码:

InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
imm.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS);

培训总结。

第一天(6月17日):
跟Peter进行了第一次网络会议。首先时自我介绍,纯英文oral speech。我这英语实在是差,又紧张。讲的不好,中间话筒还有些问题。我估计Peter是没有听清楚我说什么的。
会议上,Peter介绍了我们培训的主要内容,对一些日常规范提出了一些要求,Email 沟通一律用英文,开发文档也全部是英文。所以无论如何这个英文水平是必须提高的了,Peter给我们讲了一些我们在这个过程中可以学到的东西,不是技术,而是作事情的方式,以及国际化软件外包开发方式。这戏是在课堂是无法接触到的。只有体验了才能知道。
最后Peter给我们提了一个问题 ,问什么才叫有效的沟通。我认认为,有效的沟通可以利用多种途径和渠道来做。依的性质而选择不同的渠道。对于重要而且紧急的事情最好当面沟通。沟通之前一定要明确沟通目的,带着问题去洽谈。与客户沟通如果无法用语言描述,可以多利用多媒体技术作展示,比如PPT,产品原型工具。
下午我们就收到了Peter发来的需求文档,同样也是全英文文档。我们借助一些翻译工具,和不断探讨基本了解了该系统所实现的功能。就是利用提供的api来实现对配置文件的管理。并且将原本的xml储存方式改为数据库存储方式,并且实现对配置文件在线配置。

接下来我们发现发给我们的源代码中缺少很多引用的包。我从网上找到这些包下载了下来。 发现还是 运行不了。原来是一个注册文件的问题 删掉就OK。

总的来说这是一个了解需求,学习代码api的过程。

第二天(6月18日):

任务分配下来了,总共培训分为2组,我们组是Blue。一开始我们全部各自看文档。看需求。发现自己英语还是不行。看起来很费劲。

第三天(6月19日)

今天主要任务是明确需求,我觉得最大的问题就是需求不能明确导致不能擅自动手 ,但是也只能摸着石头过河,一步一步走了 。我们

第四天(6月20日)

今天上午我一大早来到机房。分工有所调动。我们组组长和Green组的组长调换了。我们各自任务也被调换。培训的目的就是要培养我们的适应能力。

第五天(6月21日)

今天,我对代码分析有了很大进展。分析出了原本软件的功能和需求。上午和Peter开了网络会议。我谈了自己的观点和收获。我觉得外包最大的障碍就是语言。外包和自己平时做项目的区别在于外包自主成分少些。不比自己做项目,自己做项目需求很明确。

第六天(6月22日)

今天在学校。由于机房位置问题和别的项目及老师有冲突我们回到自己原来的地方自己做自己的事情。周六张蓉回去了。我做了下数据库的操作。其实很简单,就是把原本对xml的操作仿写到sql。

第七天(6月23日):

周日,完成了后台对数据库的操作。但是总结下效率有些低,因为很多数据需要重复建立数据库连接。我优化了下张静写的SQLHelper。在其他组员看来好像很难的任务被我完成了。冠以高手称号,呵呵实在不敢当。我只是有性格就是相信自己能做好就一定会全力以赴的做。所以有时候我会有点吹,以极度自信来为自己提供动力。

第八天(6月24日)

今天我回到了六楼。因为英语考试的问题。我们和Peter请了假。后来Peter跟我们放假三天。我们考试完的继续做我们之前的项目。我在项目中完成了数据库读取到缓存,从缓存到数据库的操作。这主要是对数据结构的理解。

第九天

上午我们参加了学校下学期的动员大会。由于疏忽了 没有及时和Jordan和Peter沟通,遭到了批评。

今天和Peter网络会议,主要查看了我们的进度 我们演示了demo,我做为我们组负责讲解和演示,感觉讲的不是很好,我犯的一个错误就是当着客户修改了代码。这是不允许的。客户关注的主要是功能客户要看什么先给客户看,如果没有异议了再谈自己的产品。Peter给我们提了些意见,是关于操作方面的。比如对treeview进行修改。增加右键菜单。对树状结构的节点进行快速收缩,删除和重命名等操作。

第十天

今天向Peter汇报了我们的进度并且发了一个可运行版本过去。我们根据昨天Peter提的需求差不多完成了,其实还有很多Bug还没有解决。不过源代码的 然后周4,5,6留给我们自己去安排自己其它的项目。我们培训的人当中其它5人继续负责完善这个项目。

C# 多线程编程 ThreadStart ParameterizedThreadStart

在实例化Thread的实例,需要提供一个委托,在实例化这个委托时所用到的参数是线程将来启动时要运行的方法。在.net中提供了两种启动线程的方式,一种是不带参数的启动方式,另一种是带参数的启动的方式。
不带参数的启动方式
如果启动参数时无需其它额外的信息,可以使用ThreadStart来实例化Thread,如下面的代码:


1 using System;
2 using System.Collections.Generic;
3 using System.Text;
4 using System.Threading;
5
6 namespace StartThread
7 {
8 class Program
9 {
10 int interval = 200;
11 static void Main(string[] args)
12 {
13 Program p = new Program();
14 Thread nonParameterThread = new Thread(new ThreadStart(p.NonParameterRun));
15 nonParameterThread.Start();
16 }
17 ///

18 /// 不带参数的启动方法
19 ///

20 public void NonParameterRun()
21 {
22 for (int i = 0; i < 10; i++) 23 { 24 Console.WriteLine("系统当前时间毫秒值:"+DateTime.Now.Millisecond.ToString()); 25 Thread.Sleep(interval);//让线程暂停 26 } 27 } 28 }

程序的运行效果我们不用运行也会知道,那就是在循环中将系统当前时间的毫秒部分输出出来,在每次输出之后会将当前线程暂停一下,直到10次之后运行完毕,终止线程的执行。
在上面的代码中我们是通过定义全局变量的方法来指定线程暂停间隔,按照这种方法,假如要运行10个线程,每个线程的暂停间隔不一样的话,就需要定义10个全局变量,虽然最终不影响系统的运行效果,但是总觉得不是太爽。
有没有比较简单一点的办法呢?有!那就是使用带参数的启动方法。
带参数的启动方法
如果要在实例化线程时要带一些参数,就不能用ThreadStart委托作为构造函数的参数来实例化Thread了,而要 ParameterizedThreadStart委托,和ThreadStart一样的是它也是线程启动时要执行的方法,和ThreadStart不同的是,它在实例化时可以用一个带有一个Object参数的方法作为构造函数的参数,而实例化ThreadStart时所用到的方法是没有参数的。
为什么是Object这样的参数呢?很简单,因为在.net中Object是所有类型的基类,用它可以表示Array(数组)、Interface(接口)、ValueType(值类型,如bool,byte,char,short,int,float,long,double等)、class(类)等.net中的类型。当然,这也意味着如果你要启动一个线程,给它传递一个int类型参数时,必须在 启动方法中进行相应的类型转换。
下面就是一个例子,在启动线程时指定了线程的暂停间隔,代码如下:

1 using System;
2 using System.Collections.Generic;
3 using System.Text;
4 using System.Threading;
5
6 namespace StartThread
7 {
8 class Program
9 {
10 int interval = 200;
11 static void Main(string[] args)
12 {
13 Program p = new Program();
14
15 Thread parameterThread = new Thread(new ParameterizedThreadStart(p.ParameterRun));
16 parameterThread.Name = "Thread A:";
17 parameterThread.Start(30);
18 }
19
20 ///

21 /// 带参数的启动方法
22 ///

23 ///让线程在运行过程中的休眠间隔 24 public void ParameterRun(object ms)
25 {
26 int j = 10;
27 int.TryParse(ms.ToString(), out j);//这里采用了TryParse方法,避免不能转换时出现异常
28 for (int i = 0; i < 10; i++) 29 { 30 Console.WriteLine(Thread.CurrentThread.Name+"系统当前时间毫秒值:" + DateTime.Now.Millisecond.ToString()); 31 Thread.Sleep(j);//让线程暂停 32 } 33 } 34 } 35 }

在这个方法里,我们在启动线程时顺便指定了线程的暂停间隔,也就是这句:
parameterThread.Start(30);
线程启动时运行的方法是public void ParameterRun(object ms),这个值为30的int类型变量被装箱成object,所以在方法中还需要将它转换成int类型,这个可以通过拆箱或者其它办法解决。
假如我们要启动两个线程,每个线程的暂停间隔不一样,启动代码如下:

  


1 using System;
2 using System.Collections.Generic;
3 using System.Text;
4 using System.Threading;
5
6 namespace StartThread
7 {
8 class Program
9 {
10 int interval = 200;
11 static void Main(string[] args)
12 {
13 Program p = new Program();
14
15 Thread parameterThread = new Thread(new ParameterizedThreadStart(p.ParameterRun));
16 parameterThread.Name = "Thread A:";
17 parameterThread.Start(30);
18 //启动第二个线程
19 parameterThread = new Thread(new ParameterizedThreadStart(p.ParameterRun));
20 parameterThread.Name = "Thread B:";
21 parameterThread.Start(60);
22 }
23
24 ///

25 /// 带参数的启动方法
26 ///

27 ///让线程在运行过程中的休眠间隔 28 public void ParameterRun(object ms)
29 {
30 int j = 10;
31 int.TryParse(ms.ToString(), out j);//这里采用了TryParse方法,避免不能转换时出现异常
32 for (int i = 0; i < 10; i++) 33 { 34 Console.WriteLine(Thread.CurrentThread.Name+"系统当前时间毫秒值:" + DateTime.Now.Millisecond.ToString()); 35 Thread.Sleep(j);//让线程暂停 36 } 37 } 38 } 39 }

对上面的代码做一点说明,就是线程启动之后,线程的实例不必再存在,例如在上面的代码中我用的是同一个实例实例化了两个线程,并且这两个线程运行很正常。
继续探索
上面解决了一个问题,如果在启动线程时需要参数如何解决,如果针对上面的问题继续发掘,比如:在启动线程时不但要指定线程的暂停间隔,还需要指定循环次数(在上面的所有例子中都是执行10次的),这个问题该如何解决呢?
有两种办法可以解决:
首先可以继续在ParameterizedThreadStart这里做文章,因为这里可以使用一个Object类型的参数,那么可以通过数组或者一个类来解决(因为它们都是Object的子类)。我在做某个系统时确实采用数组处理过这种情况,这样就要求在线程启动方法中必须清楚知道数组中每个参数的用途,不是太方便。
这里说说重新定义一个实体类来解决的方法,代码如下。

1 using System;
2 using System.Collections.Generic;
3 using System.Text;
4 using System.Threading;
5
6 namespace StartThread
7 {
8 class MyThreadParameter
9 {
10 private int interval;
11 private int loopCount;
12 ///

13 /// 循环次数
14 ///

15 public int LoopCount
16 {
17 get { return loopCount; }
18 }
19
20 ///

21 /// 线程的暂停间隔
22 ///

23 public int Interval
24 {
25 get { return interval; }
26 }
27 ///

28 /// 构造函数
29 ///

30 ///线程的暂停间隔 31 ///循环次数 32 public MyThreadParameter(int interval,int loopCount)
33 {
34 this.interval = interval;
35 this.loopCount = loopCount;
36 }
37 }
38 class Program
39 {
40 int interval = 200;
41 static void Main(string[] args)
42 {
43 Program p = new Program();
44
45 Thread parameterThread = new Thread(new ParameterizedThreadStart(p.MyParameterRun));
46 parameterThread.Name = "Thread A:";
47 MyThreadParameter paramter = new MyThreadParameter(50, 20);
48 parameterThread.Start(paramter);
49 }
50
51
52 ///

53 /// 带多个参数的启动方法
54 ///

55 ///方法参数 56 public void MyParameterRun(object ms)
57 {
58 MyThreadParameter parameter = ms as MyThreadParameter;//类型转换
59 if (parameter != null)
60 {
61 for (int i = 0; i < parameter.LoopCount; i++) 62 { 63 Console.WriteLine(Thread.CurrentThread.Name + "系统当前时间毫秒值:" + DateTime.Now.Millisecond.ToString()); 64 Thread.Sleep(parameter.Interval);//让线程暂停 65 } 66 } 67 } 68 } 69 }

第二种方法和上面方法有些相似,也是需要引入外部类,并且将Thread实例放在引入的类中,这种情况适合于在线程中处理的业务逻辑比较复杂的情况。在前不久处理的一个项目中我用过这种情况,它是用来实现双向数据传输的。
如果实现上面的效果,代码如下:

  

1 using System;
2 using System.Collections.Generic;
3 using System.Text;
4 using System.Threading;
5
6 namespace StartThread
7 {
8 class MyThreadParameter
9 {
10 private int interval;
11 private int loopCount;
12 private Thread thread;
13
14 ///

15 /// 构造函数
16 ///

17 ///线程的暂停间隔 18 ///循环次数 19 public MyThreadParameter(int interval,int loopCount)
20 {
21 this.interval = interval;
22 this.loopCount = loopCount;
23 thread = new Thread(new ThreadStart(Run));
24 }
25
26 public void Start()
27 {
28 if (thread != null)
29 {
30 thread.Start();
31 }
32 }
33
34 private void Run()
35 {
36 for (int i = 0; i < loopCount; i++) 37 { 38 Console.WriteLine("系统当前时间毫秒值:" + DateTime.Now.Millisecond.ToString()); 39 Thread.Sleep(interval);//让线程暂停 40 } 41 } 42 } 43 class Program 44 { 45 static void Main(string[] args) 46 { 47 MyThreadParameter parameterThread = new MyThreadParameter(30, 50); 48 parameterThread.Start(); 49 } 50 51 } 52 }

上面的代码的运行效果和前面的代码运行效果类似,只不过是将业务处理代码放在一个单独的类MyThreadParameter中,使得MyThreadParameter看起来也像一个Thread,实际上维护的还是其内部的Thread,在一些大型系统中这样做的好处是便于维护。
总结:在本篇主要讲述如何启动线程的问题,在启动时可能会遇到无需参数、需要多个参数的情况,在这里讲述了如何解决这些问题的思路。在.net类库中虽然存在着庞大的类库,但是并不是总会有合适的类来解决我们所遇到的问题,但是只要肯动脑筋总会想到合适的办法。