簡體   English   中英

調試AsyncTask-奇怪的行為,調試跳入代碼

[英]Debugging AsyncTask - strange behaviour, debug jumping into the code

我正在調試一個僅下載文件的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); 跳過返回null; 進入catch塊,但Exception e為null,然后調試器轉到AsyncTask的第1行,即打包com.example.compa.asynctasks; 然后繼續執行(執行onPostExecute方法),當然,返回的結果為null

怎么了? 為什么以這種方式調試跳轉?

任務正確下載文件。

這是實例化並調用異步任務的活動的代碼

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中的委托為null

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

如果不是這種情況,則上面的代碼存根並沒有定義它。

我自己解決了。

1,我將調用移到onStart()方法而不是onCreate()中的異步任務上

2,我在改行中犯了一個錯誤

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

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

避免一個愚蠢的空指針(我已經聲明了CoverImg)!

無論如何,我仍然不了解調試的行為,但是我解決了我的問題。

謝謝大家

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM