我在程序首次启动的时候复制一些文件到sd卡上面,我用的是异步任务来实现的,但是还是明显感到启动时黑屏卡顿很久。按理论来说,启用了异步任务不会阻塞主线程的,但为什么主线程还是被阻塞了,很疑惑
上代码看看吧。
或者你降优先级试试。
class CopyTask extends AsyncTask{
@Override
protected Void doInBackground(String... params) {
// TODO Auto-generated method stub
copyPicture(params[0],params[1]);
return null;
}
}
就是在 doInBackground里面去调用了复制文件的代码
经过调试发现,主线程的pid和在异步任务里面执行的外码的pid是一样的,说明他们还是同一个线程,这是为毛啊,说好的新线程呢?
首先判断这段代码有没有执行,如果没有,先看看是否调用了execute方法,如果都正常,看其他位置是否有耗时操作。如下代码放在onCreate中正常执行,没有卡顿。
new AsyncTask<String,Integer,String>(){
@Override
protected String doInBackground(String... params) {
System.out.println("===========================");
SystemClock.sleep(5000);
System.out.println("===========================");
return null;
}
}.execute("hello world");
首先,pid指的是进程ID,你的主线程和子线程应该是在同一个进程,所以pid是相同的,tid应该不一样。至于卡顿,要么就是你的AsyncTask用得不对,要么就是有其他地方阻塞了主线程;最后实在不行,直接用new Thread{}.start()也未尝不可。
上面的说得对,他们确实不是在同一个线程,我估计也是其他地方阻塞了主线程,哎,现在问题还没有找到