0

我在java.lang.NullPointerException这里遇到错误:

com.mysite.datasources.ArticlesDataSource.open(ArticlesDataSource.java:88)

代码是这样的:

public void open() throws SQLException
{
    database = dbHelper.getWritableDatabase(); //this is line 88
}

它是importArticles()ArticlesDataSource.

从我的调用时,这工作正常SplashScreenActivity

articlesDataSource = new ArticlesDataSource(context);
try {
    articlesDataSource.importArticles(Section.currentSection, false);
    ...

但是当我尝试从我的ImportArticlesAsync(within MainActivity) 调用它时,我得到了NullPointerException错误。

//This is within my MainActivity class

    //...
    ImportArticlesAsync importArticlesAsync = new ImportArticlesAsync(this);
    importArticlesAsync.execute("");
}

private class ImportArticlesAsync extends AsyncTask<String, Void, String>
{

    Context mContext;
    //ProgressDialog waitSpinner;
    private ArticlesDataSource articlesDataSource;
    //ConfigurationContainer configuration = ConfigurationContainer.getInstance();

    public ImportArticlesAsync(Context context) {
        mContext = context;
        //waitSpinner = new ProgressDialog(this.context);
    }

    @Override
    protected String doInBackground(String... params)
    {
        //IMPORTS THE ARTICLES FROM THE RSS FEED (adds or updates)
    //tried just mContext //notice
    //tried mContext.getApplicationContext() //ERROR / crash

        articlesDataSource = new ArticlesDataSource(mContext);
        try {
            articlesDataSource.importArticles(Section.currentSection, false);
        } catch (Exception e) {
            Toast toast = Toast.makeText(
                    mContext,
                    "NOTICE: Could not import/update " + Section.currentSection.toString() + " articles.",
                    Toast.LENGTH_LONG);
            toast.show();
        }
        return null;
    }


    @Override
    protected void onPostExecute(String result) {

        //loads article from database to the list
        loadArticlesIntoList(Section.currentSection);
}
}

从我读过的内容来看,大多数人认为这一定是不正确的上下文。但是 - 我还没有真正理解上下文,并且已经尝试了我能想到的所有方法(并且阅读了很多关于上下文的内容)。


我尝试对我的“代码”进行图表/更清晰的解释:

//YAY this works!
SplashScreenActivity
    -LoadApplication (AsyncTask)
        -doInBackground
             articlesDataSource = new ArticleDataSource(context);
             articlesDataSource.importArticles(Section.currentSection, false);

//BOO, this doesn't work!
MainActivity
    -ImportArticlesAsync
        -doInBackground (AsyncTask)
             articlesDataSource = new ArticlesDataSource(context);
             articlesDataSource.importArticles(Section.currentSection, false);

每个请求 - dbHelper 在这里设置:

private SQLiteDatabase database;
private DbHelper dbHelper;
private PhotosDataSource photosdatasource;
private SectionsDataSource sectionsdatasource;

public ArticlesDataSource(Context context)
{
    mContext = context;
    dbHelper = new DbHelper(mContext);
    photosdatasource = new PhotosDataSource(context);
    sectionsdatasource = new SectionsDataSource(context);
}

public void open() throws SQLException
{
    database = dbHelper.getWritableDatabase();
}

代码:

com.mysite.news

com.mysite.models

com.mysite.datasources

com.mysite.utilites

AndroidManifest.xml - http://pastebin.com/hHF86f4d


错误:

07-20 21:33:26.721: W/System.err(8260): java.lang.NullPointerException 07-20 21:33:26.721: W/System.err(8260): 在 android.content.ContextWrapper.openOrCreateDatabase( ContextWrapper.java:203) 07-20 21:33:26.721: W/System.err(8260): 在 android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:118) 07-20 21:33:26.721: W/System.err(8260): 在 com.mysite.datasources.ArticlesDataSource.open(ArticlesDataSource.java:88) 07-20 21:33:26.721: W/System.err(8260): 在 com.mysite.datasources .ArticlesDataSource.importArticles(ArticlesDataSource.java:101) 07-20 21:33:26.721: W/System.err(8260): 在 com.mysite.news.MainActivity$ImportArticlesAsync.doInBackground(MainActivity.java:194) 07- 20 21:33:26.721: W/System.err(8260): 在 com.mysite.news.MainActivity$ImportArticlesAsync.doInBackground(MainActivity.java:1) 07-20 21:33:26.721: W/System.err(8260): 在 android.os.AsyncTask$2.call(AsyncTask.java:185) 07-20 21:33:26.721: W/System.err(8260): 在 java. util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306) 07-20 21:33:26.721: W/System.err(8260): at java.util.concurrent.FutureTask.run(FutureTask.java:138 ) 07-20 21:33:26.721: W/System.err(8260): 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088) 07-20 21:33:26.721: W/System.err (8260): 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581) 07-20 21:33:26.721: W/System.err(8260): 在 java.lang.Thread.run(线程.java:1019)721: W/System.err(8260): 在 java.util.concurrent.FutureTask.run(FutureTask.java:138) 07-20 21:33:26.721: W/System.err(8260): 在 java.util .concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088) 07-20 21:33:26.721: W/System.err(8260): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581) 07-20 21:33:26.721: W/System.err(8260): 在 java.lang.Thread.run(Thread.java:1019)721: W/System.err(8260): 在 java.util.concurrent.FutureTask.run(FutureTask.java:138) 07-20 21:33:26.721: W/System.err(8260): 在 java.util .concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088) 07-20 21:33:26.721: W/System.err(8260): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581) 07-20 21:33:26.721: W/System.err(8260): 在 java.lang.Thread.run(Thread.java:1019)


SectionSelectedListener.java

package com.mysite.news;

import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;

public class SectionSelectedListener implements OnItemSelectedListener
{
    public void onItemSelected(AdapterView<?> parent, View view, int pos, long id)
    {
        MainActivity mainActivity = new MainActivity();
        mainActivity.sectionSelected();     
    }

    public void onNothingSelected(AdapterView<?> arg0) {
        // Do nothing       
    }

}
4

3 回答 3

1

Context您传递给的参考AsyncTasknull. 问题出现在您实例化一个 newMainActivity只是为了调用该sectionSelected()方法。你永远不应该自己实例化一个活动!

最简单的解决方案是简单地将匿名内部类作为侦听器MainActivity

sectionsSpinner.setOnItemSelectedListener(new OnItemSelectedListener()
{
    public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
       sectionSelected();     
    }

    public void onNothingSelected(AdapterView<?> arg0) {
        // Do nothing       
    }

});
于 2012-07-21T14:54:35.950 回答
0

试着把这条线articlesDataSource = new ArticlesDataSource(mContext);从你的方法移到doInBackground(..)AsyncTaskonPreExecute()方法AsyncTask。像这样的东西:

private class ImportArticlesAsync extends AsyncTask<String, Void, String>
{

Context mContext;
//ProgressDialog waitSpinner;
private ArticlesDataSource articlesDataSource;
//ConfigurationContainer configuration = ConfigurationContainer.getInstance();

public ImportArticlesAsync(Context context) {
    mContext = context;
    //waitSpinner = new ProgressDialog(this.context);
}

@Override
protected void onPreExecute()
{
   articlesDataSource = new ArticlesDataSource(mContext);
}


@Override
protected String doInBackground(String... params)
{        
    try {
        articlesDataSource.importArticles(Section.currentSection, false);
    } catch (Exception e) {
        Toast toast = Toast.makeText(
                mContext,
                "NOTICE: Could not import/update " + Section.currentSection.toString() + " articles.",
                Toast.LENGTH_LONG);
        toast.show();
    }
    return null;
}


@Override
protected void onPostExecute(String result) {

    //loads article from database to the list
    loadArticlesIntoList(Section.currentSection);
}
}

我认为这将解决您的问题。

于 2012-07-20T20:47:01.140 回答
0

将 dbHelper 变量从 ArticlesDataSource 类移动到 Activity,确保在创建 AsyncTask 之前对其进行初始化。

于 2012-07-20T20:59:48.880 回答