繁体   English   中英

在asynctasking中不断获取空指针异常

[英]keep getting null pointer exception in asynctasking

好的,所以我知道我应该使用接口从AsyncTask检索信息,因为它们在单独的线程中运行,但是我一直在徒劳地尝试正确地做到这一点。 有人可以指导我代码有什么问题吗?

首先,我以为我在callback.onJsonReady(movie)处获取了空指针异常,因为我仍在尝试获取尽管尝试仍未处理的电影。 因此,我尝试在它检索之前将其休眠5000ms,但仍然收到空指针异常。 请帮我。

如果您需要查看更多我的代码,请也告诉我。

以下是我设置界面的方法

        protected void onPostExecute(String s) {
        super.onPostExecute(s);
        processData(getmData());
    }

    private void processData (String mData){
        try {
            final String MOVIE_TITLE = "Title";

            JSONObject jsonObject = new JSONObject(mData);

            Log.v(LOG_TAG, mData);

            String title = jsonObject.getString(MOVIE_TITLE);

            Movie movie = new Movie(title);
            callback.onJsonReady(movie);
            Log.v(LOG_TAG, "Title of the movie is " + movie.getTitle());
        }catch (JSONException e){
            Log.e(LOG_TAG, "Error retrieving JsonData");
            e.printStackTrace();
        }
    }
}

下面是我在该类中调用接口的地方

public class ResultsPage extends AppCompatActivity implements ParseJsonData.ParseJsonCallback{

private final String LOG_TAG = getClass().getSimpleName();
private TextView title;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_results_page);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    setTextViews();

}

private void setTextViews () {
    Bundle bundle = getIntent().getExtras();

    String movieTitle = bundle.getString("title");

    Log.v(LOG_TAG, "title recieved is : " + movieTitle);

    ParseJsonData parseJsonData = new ParseJsonData(movieTitle, this);
    parseJsonData.execute();

}

@Override
public void onJsonReady(Movie movie) {
    title.setText(movie.getTitle());
}
}

我的logcat是

03-14 18:03:02.931 30827-30827/? E/AndroidRuntime: FATAL EXCEPTION: main
   Process: com.jc.tagyourmovie, PID: 30827
   java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference
       at com.jc.tagyourmovie.ResultsPage.onJsonReady(ResultsPage.java:44)
       at com.jc.tagyourmovie.ParseJsonData$ParseJsonDataBackground.processData(ParseJsonData.java:83)
       at com.jc.tagyourmovie.ParseJsonData$ParseJsonDataBackground.onPostExecute(ParseJsonData.java:69)
       at com.jc.tagyourmovie.ParseJsonData$ParseJsonDataBackground.onPostExecute(ParseJsonData.java:53)
       at android.os.AsyncTask.finish(AsyncTask.java:651)
       at android.os.AsyncTask.access$500(AsyncTask.java:180)
       at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:668)
       at android.os.Handler.dispatchMessage(Handler.java:102)
       at android.os.Looper.loop(Looper.java:158)
       at android.app.ActivityThread.main(ActivityThread.java:7224)
       at java.lang.reflect.Method.invoke(Native Method)
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)

您的Textview 标题未初始化...这就是原因

您需要执行以下操作:

title = (TextView)findViewById(R.id.<your_tv_id>);

错误在title.setText行中。 Logcat如此> java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference

似乎您尚未初始化名为titletextview ,请在使用它之前对其进行初始化。

您的代码声明了一个名为titletextview

private TextView title;

您必须在onCreate()中初始化此textview,如下所示

title = (TextView)findViewById(R.id.TEXTVIEWID);

您需要将将UI更改为AsyncTask的onPostExecute部分的代码移动。

callback.onJsonReady(movie);

这部分可以在doInBackground中,但是使用AsynchTask的字段而不是本地var,因此您可以在onPostExecute中访问它:

Movie movie = new Movie(title);
private TextView title;

您需要给title赋一个值,如下所示:

title = (TextView) R.findViewById(R.id.textviewid);

之后,您可以在其上调用setText() xmlviewid替换为xml文件中的textview的ID。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM