[英]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.listView1
的splash.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
,所以lv
为null
。 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.