Android 与背景线程混淆

Android 与背景线程混淆,android,multithreading,android-asynctask,background-thread,Android,Multithreading,Android Asynctask,Background Thread,我有两个异步任务,一个用于下载xml文件(DownloadTask),另一个用于解析文件(ParseXMLTask)。 使用此任务有两种情况: 1) 文件不存在>执行下载任务,onPostExecute>ParseXMLTask 2) 文件存在>仅执行ParseXMLTask 一切正常,但问题是,在执行第二种情况时,用户界面出现了大约3秒的阻塞(黑屏),这肯定会让用户感到恼火。这绝对让我困惑,因为第二种情况下的工作似乎更容易 所以,当我测试我的应用程序时,情况是这样的:我第一次点击按钮,文件被下

我有两个异步任务,一个用于下载xml文件(DownloadTask),另一个用于解析文件(ParseXMLTask)。 使用此任务有两种情况:

1) 文件不存在>执行下载任务,onPostExecute>ParseXMLTask

2) 文件存在>仅执行ParseXMLTask

一切正常,但问题是,在执行第二种情况时,用户界面出现了大约3秒的阻塞(黑屏),这肯定会让用户感到恼火。这绝对让我困惑,因为第二种情况下的工作似乎更容易

所以,当我测试我的应用程序时,情况是这样的:我第一次点击按钮,文件被下载,保存在sd卡上,解析并最终打开。然后我返回并再次单击按钮。现在我看到了在活动之间切换时的滞后

代码:

执行任务

private void downloadPack() {
    if (packDownloaded) {
        parseXML();
    } else {    
        download = new DownloadFile(fileName, this, loadingBar);
        download.execute(serverURL + fileName + ".xml");
    }
}

private void parseXML() {
    ParseXMLTask parseTask = new ParseXMLTask(this, this);
    parseTask.execute(PATH + fileName + ".xml");
}

public void postDownload(File result) {
        parseXML();     
}   

public void postParse() {               
    Intent packIntent = new Intent(this, PackActivity.class);
    startActivity(packIntent);      
}
ParseXMLTask.java

public class ParseXMLTask extends AsyncTask<String, Integer, Void> {    

private Context context;
private XmlPullParser xpp;
private IPostParse iPostParse;

public ParseXMLTask(Context context, IPostParse iPostParse) {
    this.context = context;
    this.iPostParse = iPostParse;

}

@Override
protected Void doInBackground(String... params) {               
    File file = new File(params[0]);

    /* doing the job */
}

@Override
protected void onPostExecute(Intent result) {
    iPostParse.postParse(result);
}
}
public class DownloadFile extends AsyncTask<String, Integer, File> {

private static final String PATH = Environment
        .getExternalStorageDirectory().getPath() + "/.chgkgame/";;
private File dir;
private ProgressBar progressBar;
private String fileName;
private IPostDownload postDownload;
private boolean download;


public DownloadFile(String name, IPostDownload pDownload, ProgressBar pBar) {
    progressBar = pBar;
    fileName = name;
    postDownload = pDownload;
}


@Override
protected File doInBackground(String... sUrl) {
    URL url;
    try {
        url = new URL(sUrl[0]);
        URLConnection urlConnection = url.openConnection();
        urlConnection.connect();            
        int fileLength = urlConnection.getContentLength();

        dir = new File(PATH + fileName + ".xml");
        InputStream input = new BufferedInputStream(url.openStream());
        OutputStream output = new FileOutputStream(dir);

        byte[] data = new byte[1024];
        long total = 0;
        int count;
        while ((count = input.read(data)) != -1) {
            total += count;
            publishProgress((int) (total * 100 / fileLength));
            output.write(data, 0, count);
        }

        output.flush();
        output.close();
        input.close();
    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

    return dir;
}

@Override 
protected void onPostExecute(File result) {
    if (postDownload != null) postDownload.postDownload(result);
}

@Override
protected void onProgressUpdate(Integer... values) {
    super.onProgressUpdate(values);

    if (progressBar != null) {
        progressBar.setProgress(values[0]);
    }
}
}
公共类ParseXMLTask扩展了AsyncTask{
私人语境;
私有XmlPullParser-xpp;
私人IPostParse IPostParse;
公共ParseXMLTask(上下文上下文,IPosParse IPosParse){
this.context=上下文;
this.iposparse=iposparse;
}
@凌驾
受保护的Void doInBackground(字符串…参数){
File File=新文件(参数[0]);
/*做这项工作*/
}
@凌驾
受保护的void onPostExecute(意图结果){
iPostParse.postParse(结果);
}
}
下载文件.java

public class ParseXMLTask extends AsyncTask<String, Integer, Void> {    

private Context context;
private XmlPullParser xpp;
private IPostParse iPostParse;

public ParseXMLTask(Context context, IPostParse iPostParse) {
    this.context = context;
    this.iPostParse = iPostParse;

}

@Override
protected Void doInBackground(String... params) {               
    File file = new File(params[0]);

    /* doing the job */
}

@Override
protected void onPostExecute(Intent result) {
    iPostParse.postParse(result);
}
}
public class DownloadFile extends AsyncTask<String, Integer, File> {

private static final String PATH = Environment
        .getExternalStorageDirectory().getPath() + "/.chgkgame/";;
private File dir;
private ProgressBar progressBar;
private String fileName;
private IPostDownload postDownload;
private boolean download;


public DownloadFile(String name, IPostDownload pDownload, ProgressBar pBar) {
    progressBar = pBar;
    fileName = name;
    postDownload = pDownload;
}


@Override
protected File doInBackground(String... sUrl) {
    URL url;
    try {
        url = new URL(sUrl[0]);
        URLConnection urlConnection = url.openConnection();
        urlConnection.connect();            
        int fileLength = urlConnection.getContentLength();

        dir = new File(PATH + fileName + ".xml");
        InputStream input = new BufferedInputStream(url.openStream());
        OutputStream output = new FileOutputStream(dir);

        byte[] data = new byte[1024];
        long total = 0;
        int count;
        while ((count = input.read(data)) != -1) {
            total += count;
            publishProgress((int) (total * 100 / fileLength));
            output.write(data, 0, count);
        }

        output.flush();
        output.close();
        input.close();
    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

    return dir;
}

@Override 
protected void onPostExecute(File result) {
    if (postDownload != null) postDownload.postDownload(result);
}

@Override
protected void onProgressUpdate(Integer... values) {
    super.onProgressUpdate(values);

    if (progressBar != null) {
        progressBar.setProgress(values[0]);
    }
}
}
公共类下载文件扩展异步任务{
私有静态最终字符串路径=环境
.getExternalStorageDirectory().getPath()+“/.chgkgame/”;;
私有文件目录;
私人ProgressBar ProgressBar;
私有字符串文件名;
私人ipost下载后下载;
私有布尔下载;
公共下载文件(字符串名称、IPostDownload pDownload、ProgressBar pBar){
progressBar=pBar;
fileName=名称;
postDownload=pDownload;
}
@凌驾
受保护的文件doInBackground(字符串…sUrl){
网址;
试一试{
url=新url(sUrl[0]);
URLConnection URLConnection=url.openConnection();
urlConnection.connect();
int fileLength=urlConnection.getContentLength();
dir=新文件(路径+文件名+“.xml”);
InputStream输入=新的BufferedInputStream(url.openStream());
OutputStream output=新文件OutputStream(dir);
字节[]数据=新字节[1024];
长总计=0;
整数计数;
而((计数=输入。读取(数据))!=-1){
总数+=计数;
出版进度((整数)(总计*100/文件长度));
输出.写入(数据,0,计数);
}
output.flush();
output.close();
input.close();
}捕获(格式错误){
e、 printStackTrace();
}捕获(IOE异常){
e、 printStackTrace();
}
返回目录;
}
@凌驾
受保护的void onPostExecute(文件结果){
如果(postDownload!=null)postDownload.postDownload(结果);
}
@凌驾
受保护的void onProgressUpdate(整型…值){
super.onProgressUpdate(值);
if(progressBar!=null){
progressBar.setProgress(值[0]);
}
}
}

以上内容没有任何问题

解析速度非常快,这就是为什么您只能在一瞬间看到布局

黑屏将是
PackActivity
加载,检查此活动以了解阻止UI线程的内容


您还可以将LogCat消息放进去,以表明解析已完成,并且调用了下一个活动的创建。

您是如何得出它正在阻塞UI的结论的?你希望屏幕做什么?在执行任务的过程中,我想用进度条查看我的布局。但是我只能看到比黑屏大约1毫秒的布局,然后调用活动。我在DownloadFile类中没有看到任何onPreExecute()函数,我相信progressBar应该在这里调用
show()
。是否在调用downloadPack()之前初始化它?如果是,你能给我们看一下那部分代码吗?
loadingBar=(ProgressBar)findViewById(R.id.loadingBar)downloadPack()
方法之前执行code>。