简体   繁体   English

执行Splash Screen w AsyncTask后强制关闭

[英]Force Close After Implementation of Splash Screen w AsyncTask

I'm getting a force close issue after attempting to implement a splash screen into my app. 尝试在我的应用中实现启动画面后,我遇到了一个强制关闭问题。

The issue occurs on line 76 lv.setAdapter(adapter); 问题发生在第76行lv.setAdapter(adapter); however I'm unsure as to why. 但是我不确定为什么。

Any input is greatly appreciated. 任何输入都非常感谢。

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)

SOURCE: 资源:

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);
            }
        }
    }

Is there a View named R.id.listView1 in splash.xml ? splash.xml是否有一个名为R.id.listView1splash.xml It looks like you changed your setContentView() call to the splash screen, but your listview is on a more "main" page. 看起来您已将setContentView()调用更改为初始屏幕,但您的列表视图位于更“主”页面上。

Not to beat a dead horse but lv is null since you changed the layout with setContentView() . 不要打败死马,但是因为你用setContentView()改变了layout ,所以lvnull Maybe I can explain a little better why this is because I'm not sure you quite understand how Views work in the Activity . 也许我可以更好地解释为什么这是因为我不确定你是否完全理解Views如何在Activity工作。

When you call setContentView() it inflates the xml layout file that you set in this function. 当你调用setContentView()它会膨胀你在这个函数中设置的xml layout文件。 Initializing any View that is not in that layout file will return null which will give a NPE when you try to set a method on it such as setAdapter() . 初始化不在layout文件中的任何View将返回null ,当您尝试在其上设置方法setAdapter()例如setAdapter()时将提供NPE

It appears that you are under the assumption that you can still initialize the ListView which is in another layout file...you cannot. 看来你假设你仍然可以初始化另一个layout文件中的ListView ......你做不到。 You can only use Views inflated with setContentView() or by inflating the layout file which holds that View and adding it to the currently inflated `layout. 您只能使用Views与膨胀setContentView()或充气的layout持有该文件View并将其添加到当前膨胀`布局。

One way around this is to call setContentView() again in onPostExecute() then initialize your ListView and set the Adapter . 解决此问题的一种方法是在onPostExecute()再次调用setContentView()然后初始化ListView并设置Adapter I wouldn't normally recommend calling setContentView() more than once in a single Activity but in your case it may be the easiest for what you currently have. 我通常不会建议在单个Activity多次调用setContentView() ,但在您的情况下,它可能是您目前拥有的最简单的。

So it might look like this 所以它可能看起来像这样

  @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);

lv is likely null here. lv在这里可能是null。 Have you verified in the debugger that it is getting set correctly when you set it to (ListView) findViewById(R.id.listView1); 您是否在调试器中验证了将其设置为(ListView) findViewById(R.id.listView1);时它已正确设置(ListView) findViewById(R.id.listView1); ?

Null Pointer Exception suggest that there might be problem with lv. 空指针异常表明lv可能存在问题。 You have changed the name of xml.so verify whether R.id.listview1 is present in splash.xml 您已更改xml的名称。验证是否在splash.xml中存在R.id.listview1

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

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