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

标签 java android debugging android-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(true); 它跳到 返回空值; 进入 catch block ,但 Exception e 为 null,然后调试器转到 AsyncTask 的第 1 行,这就是简单的 包 com.example.compa.asynctasks; 然后继续执行(执行onPostExecute方法),当然返回结果为null

会发生什么?为什么要这样调试跳转?

任务正确下载文件。

这里是实例化并调用异步任务的 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();
    }

}
}

错误的堆栈跟踪:

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):在com.example.compa.asynctasks.AsyncDownloadFilesTask.onPostExecute(AsyncDownloadFilesTask.java:65) 是AsyncDownloadFilesTask类的最后一个,并且是右括号,}

谢谢

最佳答案

我没有足够的点来发表评论,但看起来您的 onPostExecute 中的委托(delegate)为空

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

如果情况并非如此,则上面的代码 stub 并未定义它。

关于java - 调试 AsyncTask - 奇怪的行为,调试跳转到代码中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21942802/

相关文章:

android - jack 编译永远

android - Kotlin 懒惰使用

javascript - 如何使用 Source Maps 在 Chrome 调试器中黑箱文件?

c - 如何使用 gcc sanitizer

java - 如何在Java中声明参数化对象数组?

java - 使用 Jmockit 验证 FutureCallback 效果的最佳方法

java - 单点登录成功登录后重定向到不同的 URL

java - Java 如何处理泛型的模糊类型推断?

android - actionbar 和 tabhost/tabactivity 有什么区别

jquery - 最好的 jQuery 调试插件是什么?