调试AsyncTask - 奇怪的行为,调试跳转到代码中

时间:2014-02-21 18:51:20

标签: java android debugging android-asynctask

我正在调试一个简单下载文件的Asynctask:这里是代码:

public class AsyncDownloadFilesTask extends AsyncTask<String, Integer, Boolean> {

public AsyncResponse<Boolean> delegate=null;
protected Boolean doInBackground(String... params) {
    android.os.Debug.waitForDebugger();
    try {   
        URL url = new URL(params[0]);
        int count;
        String fileName = new String(params[1]);
        URLConnection connessione = url.openConnection();
        connessione.connect();

        int lenghtOfFile = connessione.getContentLength();
        InputStream input = new BufferedInputStream(url.openStream());

        OutputStream output = new FileOutputStream(fileName);

        long total = 0;

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

        output.flush();
        output.close();
        input.close();
        return Boolean.valueOf(true);

    } catch (Exception e) {
        return null;

    }
}

protected void onPostExecute(Boolean result) {
    delegate.processFinish(result);
}
}

我获得了一个奇怪的行为:执行到达时返回     通过Boolean.valueOf(真); 它会跳到     return null; 进入catch块,但Exception e为null,然后调试器转到AsyncTask的第1行,这很简单     package com.example.compa.asynctasks; 然后执行继续(执行onPostExecute方法),当然,返回的结果为null

会发生什么?为什么以这种方式调试跳转?

任务正确下载文件。

此处实例化并调用Async Task

的Activity的代码
package com.example.compa.activities;

import android.app.Activity;
import ...

public class CoverActivity extends Activity implements AsyncResponse<Boolean>{

ImageView coverImg;
Drawable d;
CompassesFileManager cfm;
int coverId;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_cover);
    coverId = getIntent().getExtras().getInt("coverId");
    cfm = new CompassesFileManager(this);

    ImageView coverImg = (ImageView)findViewById(R.id.cover_image);
    d = cfm.getCover(coverId);
    if (d!=null){
        coverImg.setImageDrawable(d);
    } else {
        AsyncDownloadFilesTask task = new AsyncDownloadFilesTask();
        task.delegate = this;
        task.execute(cfm.getCoverURL(coverId), cfm.getCoverFileName(coverId));
    }

}

@Override
public void processFinish(Boolean output) {
    if (output){
        Drawable d = cfm.getCover(coverId);
        coverImg.setImageDrawable(d);
    } else {
        finish();
    }

}
}

Stacktrace错误:

02-21 19:37:29.520: E/AndroidRuntime(407): FATAL EXCEPTION: main
02-21 19:37:29.520: E/AndroidRuntime(407): java.lang.NullPointerException
02-21 19:37:29.520: E/AndroidRuntime(407):  at com.example.compa.asynctasks.AsyncDownloadFilesTask.onPostExecute(AsyncDownloadFilesTask.java:65)
02-21 19:37:29.520: E/AndroidRuntime(407):  at com.example.compa.asynctasks.AsyncDownloadFilesTask.onPostExecute(AsyncDownloadFilesTask.java:1)
02-21 19:37:29.520: E/AndroidRuntime(407):  at android.os.AsyncTask.finish(AsyncTask.java:631)
02-21 19:37:29.520: E/AndroidRuntime(407):  at android.os.AsyncTask.access$600(AsyncTask.java:177)
02-21 19:37:29.520: E/AndroidRuntime(407):  at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)
02-21 19:37:29.520: E/AndroidRuntime(407):  at android.os.Handler.dispatchMessage(Handler.java:99)
02-21 19:37:29.520: E/AndroidRuntime(407):  at android.os.Looper.loop(Looper.java:176)
02-21 19:37:29.520: E/AndroidRuntime(407):  at android.app.ActivityThread.main(ActivityThread.java:5419)
02-21 19:37:29.520: E/AndroidRuntime(407):  at java.lang.reflect.Method.invokeNative(Native Method)
02-21 19:37:29.520: E/AndroidRuntime(407):  at java.lang.reflect.Method.invoke(Method.java:525)
02-21 19:37:29.520: E/AndroidRuntime(407):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1046)
02-21 19:37:29.520: E/AndroidRuntime(407):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:862)
02-21 19:37:29.520: E/AndroidRuntime(407):  at dalvik.system.NativeStart.main(Native Method)

行:     02-21 19:37:29.520:E / AndroidRuntime(407):at com.example.compa.asynctasks.AsyncDownloadFilesTask.onPostExecute(AsyncDownloadFilesTask.java:65) 是AsyncDownloadFilesTask类的最后一个,是一个结束括号,}

谢谢

2 个答案:

答案 0 :(得分:1)

我没有足够的评论点,但看起来你的onPostExecute中的委托是空的

delegate.processFinish(result); // delegate is null

如果不是这种情况,那么上面的代码存根不会定义它。

答案 1 :(得分:0)

我自己解决了。

1,我在onStart()方法中调用异步任务,而不是onCreate()

第二,我在变更线上犯了一个错误

ImageView coverImg = (ImageView)findViewById(R.id.cover_image);

coverImg = (ImageView)findViewById(R.id.cover_image);

避免使用愚蠢的空指针(我已经声明了coverImg)!

无论如何,我仍然不理解调试的行为,但我解决了我的问题。

谢谢大家