2 yus201120 yus201120 于 2016.03.10 17:15 提问

Android屏幕卡顿、黑屏问题、多线程 4C

我在程序首次启动的时候复制一些文件到sd卡上面,我用的是异步任务来实现的,但是还是明显感到启动时黑屏卡顿很久。按理论来说,启用了异步任务不会阻塞主线程的,但为什么主线程还是被阻塞了,很疑惑

6个回答

dynb19
dynb19   2016.03.10 17:31

上代码看看吧。
或者你降优先级试试。

yus201120
yus201120   2016.03.10 17:49

class CopyTask extends AsyncTask{

    @Override
    protected Void doInBackground(String... params) {
        // TODO Auto-generated method stub
        copyPicture(params[0],params[1]);
        return null;
    }

}
就是在 doInBackground里面去调用了复制文件的代码
yus201120
yus201120   2016.03.10 18:14

经过调试发现,主线程的pid和在异步任务里面执行的外码的pid是一样的,说明他们还是同一个线程,这是为毛啊,说好的新线程呢?

huaheshangxo
huaheshangxo   2016.03.10 19:05

首先判断这段代码有没有执行,如果没有,先看看是否调用了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");
dengyaoning
dengyaoning   2016.03.11 15:55

首先,pid指的是进程ID,你的主线程和子线程应该是在同一个进程,所以pid是相同的,tid应该不一样。至于卡顿,要么就是你的AsyncTask用得不对,要么就是有其他地方阻塞了主线程;最后实在不行,直接用new Thread{}.start()也未尝不可。

yus201120
yus201120   2016.03.15 09:10

上面的说得对,他们确实不是在同一个线程,我估计也是其他地方阻塞了主线程,哎,现在问题还没有找到

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!