在asynctasking中继续获取空指针异常

时间:2016-03-14 18:08:58

标签: java android android-asynctask

好的,所以我知道我应该使用接口来从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)

4 个答案:

答案 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。