好的,所以我知道我应该使用接口来从AsyncTask中检索信息,因为它们在不同的线程中运行,但我一直在徒劳地试图做到这一点。有人可以指导我解决我的代码有什么问题吗?
首先我以为我在callback.onJsonReady(movie)
得到了空指针异常,因为我仍然试图接触尽管我尝试但未处理的电影。所以我在检索之前尝试将其休眠了5000毫秒,但我仍然得到一个空指针异常。请帮帮我。
如果您需要查看更多我的代码,请告诉我。
以下是我设置界面的方法
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)
答案 0 :(得分:2)
您的 Textview 标题 未初始化...这就是原因
你需要做类似的事情:
title = (TextView)findViewById(R.id.<your_tv_id>);
答案 1 :(得分:1)
错误位于title.setText
行。 Logcat这样说&gt;
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference
似乎您尚未初始化名为textview
的{{1}},请在使用前对其进行初始化。
您的代码声明title
名为textview
title
你必须在onCreate()中初始化这个textview,如下所示
private TextView title;
答案 2 :(得分:0)
您需要将更改UI的代码移动到AsyncTask的onPostExecute部分。
callback.onJsonReady(movie);
这部分可以在doInBackground中,但是使用AsynchTask的字段而不是本地var,所以你可以在onPostExecute中访问它:
Movie movie = new Movie(title);
答案 3 :(得分:0)
private TextView title;
您需要为标题赋予一个值,如下所示:
title = (TextView) R.findViewById(R.id.textviewid);
然后你可以打电话给setText()
。
将 textviewid 替换为xml文件中textview的ID。