执行Splash Screen w AsyncTask后强制关闭

时间:2013-09-19 19:26:12

标签: java android fatal-error forceclose

尝试在我的应用中实现启动画面后,我遇到了强制关闭问题。

问题发生在第76行lv.setAdapter(adapter);但是我不确定为什么。

非常感谢任何输入。

09-19 15:20:53.687: E/AndroidRuntime(25177): FATAL EXCEPTION: main
09-19 15:20:53.687: E/AndroidRuntime(25177): java.lang.NullPointerException
09-19 15:20:53.687: E/AndroidRuntime(25177):    at com.example.project1.MainActivity$MyTask.onPostExecute(MainActivity.java:76)
09-19 15:20:53.687: E/AndroidRuntime(25177):    at com.example.project1.MainActivity$MyTask.onPostExecute(MainActivity.java:1)
09-19 15:20:53.687: E/AndroidRuntime(25177):    at android.os.AsyncTask.finish(AsyncTask.java:631)
09-19 15:20:53.687: E/AndroidRuntime(25177):    at android.os.AsyncTask.access$600(AsyncTask.java:177)
09-19 15:20:53.687: E/AndroidRuntime(25177):    at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)
09-19 15:20:53.687: E/AndroidRuntime(25177):    at android.os.Handler.dispatchMessage(Handler.java:99)
09-19 15:20:53.687: E/AndroidRuntime(25177):    at android.os.Looper.loop(Looper.java:137)
09-19 15:20:53.687: E/AndroidRuntime(25177):    at android.app.ActivityThread.main(ActivityThread.java:4931)
09-19 15:20:53.687: E/AndroidRuntime(25177):    at java.lang.reflect.Method.invokeNative(Native Method)
09-19 15:20:53.687: E/AndroidRuntime(25177):    at java.lang.reflect.Method.invoke(Method.java:511)
09-19 15:20:53.687: E/AndroidRuntime(25177):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791)
09-19 15:20:53.687: E/AndroidRuntime(25177):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:558)
09-19 15:20:53.687: E/AndroidRuntime(25177):    at dalvik.system.NativeStart.main(Native Method)

来源:

public class MainActivity extends Activity {
    Context context;
    ArrayList<String> aa = new ArrayList<String>();
        ListView lv;
        final String URL = "http://news.google.com";

        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            //setContentView(R.layout.activity_main);
            setContentView(R.layout.splash);
            lv= (ListView) findViewById(R.id.listView1);
            new MyTask().execute(URL);

        }

        private class MyTask extends AsyncTask<String, Void, String> {
            ProgressDialog prog;
            String title = "";

            @Override
            protected void onPreExecute() {
                prog = new ProgressDialog(MainActivity.this);
                prog.setMessage("Loading....");
                prog.show();
            }

            @Override
            protected String doInBackground(String... params) {
                try {
                    Document doc = Jsoup.connect(params[0]).get();
                    Element tableHeader = doc.select("tr").first();

                    for (Element element : tableHeader.children()) {
                        aa.add(element.text().toString());
                    }

                    title = doc.title();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                return title;
            }

            @Override
            protected void onPostExecute(String result) {
                super.onPostExecute(result);
                prog.dismiss();
                ArrayAdapter<String> adapter = new ArrayAdapter<String>(MainActivity.this,android.R.layout.simple_list_item_1,aa);
                lv.setAdapter(adapter);
            }
        }
    }

4 个答案:

答案 0 :(得分:1)

R.id.listView1中是否有名为splash.xml的视图?您似乎已将setContentView()调用更改为初始屏幕,但您的列表视图位于更“主”页面上。

答案 1 :(得分:1)

由于您使用lv更改了null,因此layout setContentView()不是为了击败死马。也许我可以更好地解释为什么这是因为我不确定你是否完全理解ViewsActivity的工作方式。

当您致电setContentView()时,它会膨胀您在此功能中设置的xml layout文件。初始化View文件中的任何layout将返回null,当您尝试在其上设置方法时,会NPE例如setAdapter()

您似乎仍然认为您仍然可以初始化另一个ListView文件中的layout ...您不能。您只能使用Views setContentView()layout膨胀View文件并将其添加到当前夸大的`布局。

解决此问题的一种方法是再次在setContentView() 中致电onPostExecute(),然后初始化您的ListView并设置Adapter。我通常不建议在一个setContentView()中多次拨打Activity,但在您的情况下,它可能是您目前所拥有的最简单的。

所以它可能看起来像这样

  @Override
        protected void onPostExecute(String result) {
            super.onPostExecute(result);
            prog.dismiss();
            ArrayAdapter<String> adapter = new ArrayAdapter<String>(MainActivity.this,android.R.layout.simple_list_item_1,aa);
            setContentView(R.layout.activity_main);
            lv = (ListView) findViewById(R.id.listView1);
            lv.setAdapter(adapter);

答案 2 :(得分:0)

lv此处可能为null。您是否在调试器中验证了在将其设置为(ListView) findViewById(R.id.listView1);时正确设置?

答案 3 :(得分:0)

空指针异常表明lv可能存在问题。 您已更改xml的名称。验证splash.xml中是否存在 R.id.listview1