一些总结

近期面试的一些问题。写写demo复习总结一下

1。ANR
主线程阻塞5秒以上。

制造ANR



@Override
public void onClick(View view) {
int i = 0;
do {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
} while (i++ < 9);
}



上面代码必然会出现ANR


------------
正确方法1:

用AsyncTask执行


@Override
public void onClick(View view) {
MyTask myTask = new MyTask();
myTask.execute();
}

class MyTask extends AsyncTask {

int i = 0;

@Override
protected Void doInBackground(Object... arg0) {

do {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Log.d(TAG, "" + i);
this.publishProgress(i);
} while (i++ < 9);
return null;
}

@Override
protected void onPostExecute(Object result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
txt.setText("Done");
}

@Override
protected void onPreExecute() {
super.onPreExecute();
txt.setText("Start");
}

@Override
protected void onProgressUpdate(Object... values) {
// TODO Auto-generated method stub
super.onProgressUpdate(values);
txt.setText(values[0].toString());
}

};




正确方法2:

使用handler


@Override
public void onClick(View view) {
Message message = new Message();
message.what = UPDATE_TXT;
message.obj = 0;
mHandler.sendMessage(message);
}


Handler mHandler = new Handler() {

@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
int w = msg.what;
switch (w) {
case UPDATE_TXT:
String number = msg.obj.toString();
txt.setText(number);
int added = Integer.valueOf(number) + 1;
if (added > 9) {
txt.setText("Done");
break;
}
Message message = new Message();
message.what = UPDATE_TXT;
message.obj = added;
mHandler.sendMessageDelayed(message, 3000);
break;
}
}

};


正确方法3:
IntentService


public class MyIntentService extends IntentService {
public MyIntentService() {
super("MyIntentService");// 必须写,否则startService(new Intent(this,
// MyIntentService.class));找不到无参构造函数
}

public MyIntentService(String name) {
super(name);
}

@Override
protected void onHandleIntent(Intent intent) {
// 经测试,IntentService里面是可以进行耗时的操作的
// IntentService使用队列的方式将请求的Intent加入队列,然后开启一个worker
// thread(线程)来处理队列中的Intent
// 对于异步的startService请求,IntentService会处理完成一个之后再处理第二个
for (int i = 0; i < 9; i++) {
try {
Thread.sleep(3000);
this.sendBroadcast(new Intent(MainActivity.UPDATE_TXT_ACTION).putExtra(MainActivity.INT_VALUE, i));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}


-----------
@Override
public void onClick(View view) {
this.startService(new Intent(this, MyIntentService.class));
}


private BroadcastReceiver receiver = new BroadcastReceiver() {

@Override
public void onReceive(Context context, Intent intent) {
int intExtra = intent.getIntExtra(INT_VALUE, 0);
txt.setText("" + intExtra);
}
};
别忘了注册、取消监听,并且在AndroidManifest里面注册IntentService


IntentService是继承自Service的
1.Service不是一个单独的进程 ,它和应用程序在同一个进程中。
2.Service不是一个线程,所以我们应该避免在Service里面进行耗时的操作
关于第二点我想说下,不知道很多网上的文章都把耗时的操作直接放在Service的onStart方法中,而且没有强调这样会出现Application Not Responding!希望我的文章能帮大家认清这个误区(Service不是一个线程,不能直接处理耗时的操作)。
有人肯定会问,那么为什么我不直接用Thread而要用Service呢?关于这个,大家可以网上搜搜,这里不过多解释。有一点需要强调,如果有耗时操作在Service里,就必须开启一个单独的线程来处理!!!这点一定要铭记在心。
IntentService相对于Service来说,有几个非常有用的优点,首先我们看看官方文档的说明:

这里主要是说IntentService使用队列的方式将请求的Intent加入队列,然后开启一个worker thread(线程)来处理队列中的Intent,对于异步的startService请求,IntentService会处理完成一个之后再处理第二个,每一个请求都会在一个单独的worker thread中处理,不会阻塞应用程序的主线程,这里就给我们提供了一个思路,如果有耗时的操作与其在Service里面开启新线程还不如使用IntentService来处理耗时操作。

所以,也可以,连续启动9次同样的intentService。

@Override
public void onClick(View view) {

for (int i = 1; i < 10; i++) {
this.startService(new Intent(this, MyIntentService.class).putExtra(INT_VALUE, i));
}
}


参考:http://blog.youkuaiyun.com/zhf198909/article/details/6906786




///

2. 什么是FC?如何避免FC的发生,另外FC发生时如何捕获相应的uncaught exception?

个人认为系统遇到无法处理的异常,错误等,就会强制关闭。

捕获:


public class MyApplication extends Application implements UncaughtExceptionHandler {

@Override
public void onCreate() {
super.onCreate();
Thread.setDefaultUncaughtExceptionHandler(this);
}

@Override
public void uncaughtException(Thread thread, Throwable ex) {
System.out.println("Bad things happened");
android.os.Process.killProcess(android.os.Process.myPid());
System.exit(0);
}

}

在AndroidManifest中
<application
android:name="com.example.interview.MyApplication"



///

3. Asynctask的优缺点?能否同时并发100+asynctask呢?
http://blog.youkuaiyun.com/hitlion2008/article/details/7983449
这篇博文讲的很详细





//4.0之后,默认会顺序执行

for (int i = 0; i < 7; i++) {
MyTask myTask = new MyTask(i);
myTask.execute();
//等同 myTask.executeOnExecutor(SINGLE_TASK_EXECUTOR);
}


//创建指定线程数的线程池

//最多一次并发6个线程
for (int i = 0; i < 7; i++) {
MyTask myTask = new MyTask(i);
myTask.executeOnExecutor(LIMITED_TASK_EXECUTOR);
}

//最多一次并发6个线程
for (int i = 0; i < 7; i++) {
MyTask myTask = new MyTask(i);
myTask.executeOnExecutor(FULL_TASK_EXECUTOR);
}


static {
SINGLE_TASK_EXECUTOR = (ExecutorService) Executors.newSingleThreadExecutor();
LIMITED_TASK_EXECUTOR = (ExecutorService) Executors.newFixedThreadPool(3);
FULL_TASK_EXECUTOR = (ExecutorService) Executors.newCachedThreadPool();
};


100个asynctask可以同时并发,但是一定要考虑同步的问题。



4. Handler有何作用?如何使用之(具体讲需要实现什么function)?
见上面

5. 有哪些实现自定义控件的方法?

(1)继承自现有控件,继承View


public class MyTextView extends TextView {

public MyTextView(Context context) {
super(context);
this.setBackgroundColor(Color.RED);
}

public MyTextView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
this.setBackgroundColor(Color.RED);
}

public MyTextView(Context context, AttributeSet attrs) {
super(context, attrs);
this.setBackgroundColor(Color.RED);
}

}

<com.example.interview.MyTextView
android:id="@+id/mytxt"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@+id/btn" />




(2)自定义viewgroup或其layout子类


<com.example.interview.MyOption
android:id="@+id/option"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@+id/mytxt" />


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

<ImageView
android:id="@+id/imageView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_launcher" />

<RadioButton
android:id="@+id/radioButton1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="RadioButton" />

</LinearLayout>


public class MyOption extends LinearLayout {

public MyOption(Context context, AttributeSet attrs) {
super(context, attrs);
LayoutInflater.from(context).inflate(R.layout.option, this, true);
init();

}

private void init() {

}

public MyOption(Context context) {
super(context);
LayoutInflater.from(context).inflate(R.layout.option, this, true);
init();

}

}


(3) 完完全全自定义控件


<com.example.interview.MyView
android:id="@+id/my_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@+id/option" />
/


public class MyView extends View {

public MyView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}

private void init() {
mPaint = new Paint();
mPaint.setColor(Color.RED);
mPaint.setTextSize(12);
mPaint.setStyle(Style.FILL);
}


@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawCircle(50, 50, 30, mPaint);
canvas.drawText("自定义VIEW", 50, 50, mPaint);
}


6. CMWAP, CMNET有何区别,网络通讯时是否要特殊处理?如何切换接入点?

http://www.apkbus.com/android-14631-1-1.html

CMWAP 和 CMNET 只是中国移动人为划分的两个GPRS接入方式。前者是为手机WAP上网而设立的,后者则主要是为PC、笔记本电脑、PDA等利用GPRS上网服务。它们在实现方式上并没有任何差别,但因为定位不同,所以和CMNET相比,CMWAP便有了部分限制,资费上也存在差别。

CMNET、CMWAP都是手机上网使用的接入点的名称。通过CMNET可以获得完全的Internet访问权,通过CMWAP只能访问WAP网站,不过CMWAP使用HTTP代理协议和WAP网关协议可以访问到Internet,而CMNET则适用于所有协议,它是标准的TCP/IP协议。


http://blog.sina.com.cn/s/blog_4a9f789a0100mmzc.html


cmnet能走socket和http,cmwap只能走http,要想走的话,要去移动登记注册;
eg:咱们要链接 http://blog.sina.com.cn/blogmc
cmnet方式
URL url = new URL("http://blog.sina.com.cn/blogmc");
HttpURLConnection connection = (HttpURLConnection )url.openConnection();
cmwap方式
URL url = new URL("http://10.0.0.172:80/blogmc");
HttpURLConnection connection = (HttpURLConnection )url.openConnection();
connection.setRequestProperty("X-Online-Host","blog.sina.com.cn");
connection.setRequestProperty("Accept","*/*");

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值