onProgressUpdate() 中的 NullPointerException

Posted

技术标签:

【中文标题】onProgressUpdate() 中的 NullPointerException【英文标题】:NullPointerException in onProgressUpdate() 【发布时间】:2014-01-02 07:03:09 【问题描述】:

编辑:我把这个 pB = (ProgressBar) findViewById(R.id.progressBar); 放在 onPreExecute() 中。它有效,一切正常。但这是一个好的解决方案吗?我知道在我的主线程中,进度条是!null。但是在这个 findViewById 之前,我的 asynctask 就是找不到我想要的进度条,尽管我以为我是在 .execute() 中传递它。

这是我第一次使用 asynctask。我有一个想要计数的进度条,但我不断收到 NullPointerException。

日志读取“进度更新:1”,但随后 VM 关闭。所以我知道一个整数正在通过,但我不知道为什么它找不到进度条(pB)。我试图在主线程中的 onPreExecute() 中设置Progress(0),但机器讨厌它。

它在 doInBackground() 中运行 for 循环的其余部分,并记录“Percent Progress:”和“Sleeping”,但不会再记录“Progress Update:”。

NullPointerException 在第 31 行,即 pB.setProgress(progress[0]);

@Override
protected void onProgressUpdate(Integer...progress)
    Log.d(LOG_TAG, "Progress Update: "+progress[0].toString());

    super.onProgressUpdate(progress);
    if(progress[0]!=null)
    pB.setProgress(progress[0]);
    


@Override
protected Boolean doInBackground(Integer...numSeconds)
    Log.d(LOG_TAG, "doInBackground: "+numSeconds[0]);

    try 
        int totalSecs = numSeconds[0].intValue();
        Log.d(LOG_TAG, "Total SECS: "+totalSecs);

        for(int i = 1; i <= totalSecs; i++)
            Log.d(LOG_TAG, "Sleeping "+i);
            Thread.sleep(1000);

            float percentage = ((float)i/(float)totalSecs)*100;
            Log.d(LOG_TAG, "Percentage Progress: "+ percentage);

            Float progress = Float.valueOf(percentage);
            publishProgress(new Float(progress).intValue());
        
     catch (InterruptedException e)
        e.printStackTrace();
        return false;
    
    return true;

@Override
protected void onPostExecute(Boolean result)
    Log.d(LOG_TAG, "Post Execute "+ result);

    super.onPostExecute(result);

    pB.setProgress(0);

以下是我的主线程中的一些内容:

要初始化进度条: timer = (ProgressBar) findViewById(R.id.progressBar); timer.setProgress(0);

执行异步任务:

OnClickListener startBubbles = new OnClickListener()

    @Override
    public void onClick(View arg0) 
        new ProgBar(timer).execute(100);
        setAll();
           
;

构造函数:

public ProgBar(ProgressBar pB)
    Log.d(LOG_TAG, "Constructor");


【问题讨论】:

疯狂猜测。 pB 为空! 我认为您可能正在做某事。但是我怎样才能让它不为空呢?我必须在我的 asyncTask 中再次 findViewById 吗?它应该从主线程传递,对吧? @user3067903 检查你是否在任何地方初始化了pB。 “应该是从主线程传递过来的吧?”您是将它传递给 asynctask 还是 asynctask 是活动类的内部类? findViewById 可以返回 null。 帮助我理解。您的 asynctask 是 ProgBar 并且您将进度条对象计时器传递给构造函数。你把它分配给pB吗? pB = 计时器? 【参考方案1】:

访问尚未初始化的 value 时发生空指针异常。

所以对于前。字符 a[10];

System.out.println(a[3]);

因此,您的代码中必须有变量,您无需初始化即可访问它。我的事情 numSecond 但我不确定。

抱歉,我知道的就这么多

【讨论】:

以上是关于onProgressUpdate() 中的 NullPointerException的主要内容,如果未能解决你的问题,请参考以下文章

onProgressUpdate 上的 ArrayIndexOutOfBoundsException 错误

Android,AsyncTask 不调用 onProgressUpdate 和 onPostExecute

如何更新所有片段? onProgressUpdate 不更新所有片段

在从 Internet 下载数据期间,在 AsyncTask 的 onProgressUpdate 中显示确定的 ProgressBar

如何使用 Runnable 回调替换 AsyncTask onProgressUpdate()

AsyncTask doinbackground onProgressUpdate onCancelled onPostExecute的基本使用