[英]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
似乎您尚未初始化名为title
的textview
,请在使用它之前对其进行初始化。
您的代码声明了一个名为title
的textview
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.