[英]Force Close After Implementation of Splash Screen w AsyncTask
嘗試在我的應用中實現啟動畫面后,我遇到了一個強制關閉問題。
問題發生在第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);
}
}
}
在splash.xml
是否有一個名為R.id.listView1
的splash.xml
? 看起來您已將setContentView()
調用更改為初始屏幕,但您的列表視圖位於更“主”頁面上。
不要打敗死馬,但是因為你用setContentView()
改變了layout
,所以lv
為null
。 也許我可以更好地解釋為什么這是因為我不確定你是否完全理解Views
如何在Activity
工作。
當你調用setContentView()
它會膨脹你在這個函數中設置的xml layout
文件。 初始化不在該layout
文件中的任何View
將返回null
,當您嘗試在其上設置方法setAdapter()
例如setAdapter()
時將提供NPE
。
看來你假設你仍然可以初始化另一個layout
文件中的ListView
......你做不到。 您只能使用Views
與膨脹setContentView()
或充氣的layout
持有該文件View
並將其添加到當前膨脹`布局。
解決此問題的一種方法是在onPostExecute()
再次調用setContentView()
, 然后初始化ListView
並設置Adapter
。 我通常不會建議在單個Activity
多次調用setContentView()
,但在您的情況下,它可能是您目前擁有的最簡單的。
所以它可能看起來像這樣
@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
在這里可能是null。 您是否在調試器中驗證了將其設置為(ListView) findViewById(R.id.listView1);
時它已正確設置(ListView) findViewById(R.id.listView1);
?
空指針異常表明lv可能存在問題。 您已更改xml的名稱。驗證是否在splash.xml中存在R.id.listview1
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.