2013-09-19 4 views
0

Я получаю силовую проблему после попытки реализовать заставку в моем приложении.Force Close После реализации экрана Splash 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); 
      } 
     } 
    } 

ответ

1

Не бить мертвую лошадь, но lv это null, так как вы изменили layout с setContentView(). Может быть, я могу объяснить немного лучше, почему это происходит потому, что я не уверен, что вы прекрасно понимаете, как Views работают в Activity.

При вызове 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); 
+0

«О, о, о, это волшебство, вы знаете,/Никогда не верьте, что это не так ..." Благодаря CodeMagic! https://www.youtube.com/watch?v=4iiryJwvDtc – OhNoItsAnOverflow

+0

@OhNoItsAnOverflow вы радушны. Пожалуйста, примите ответ, нажав на галочку, если это фиксированный вашу проблему – codeMagic

+0

Он сделал ... спасибо (я просто ждал таймер истекает) – OhNoItsAnOverflow

0

lv вероятно нулевой здесь. Вы проверили в отладчике, что он правильно настроен, когда вы установите его на (ListView) findViewById(R.id.listView1);?

+0

Странная вещь работает хорошо, пока я не изменил setContentView (R.layout.activity_main); setContentView (R.layout.splash); – OhNoItsAnOverflow

+0

Итак, да ... он заполнен (пока я не изменил макет, чтобы отображать заставку до тех пор, пока значения не будут получены с помощью asynctask) – OhNoItsAnOverflow

+1

Так что 'lv' не включен в' R.layout.splash', поэтому он будет null, если вы попытаетесь получить его через 'findViewById'. –

1

Есть ли вид с именем R.id.listView1 в splash.xml? Похоже, вы изменили свой вызов setContentView() на заставку, но ваш список находится на более «главной» странице.

0

Null Pointer Exception предполагает, что может возникнуть проблема с lv. Вы изменили название xml.so проверить, является ли R.id.listview1 присутствует в splash.xml