0
  1. Activity创建一个新的Thread
  2. run()方法通过输入流获取对象(vector)。
  3. 现在我想在ListView上显示Vector的内容,调用direc
  4. 这就是所有......但它不工作,并抛出一个Exception

代码:Android Handler NullPointerException

public class FileExplorerActivity extends Activity implements Runnable 
{ 
    public static final String TAG="ricky"; 
    Vector<String> dirs = new Vector<String>(); 
    ListView direc; 
    static ArrayAdapter<String> arrayAdapter; 
    Handler handler; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.fileexplorer); 
     direc = (ListView) findViewById(R.id.directoriesss); 
     handler = new Handler(); 
     Thread thread = new Thread(this); 
     thread.start(); 
    } 

    public FileExplorerActivity() 
    { 

    } 

    public void run() 
    { 
     Log.d(TAG, "FileExplorer: Thread started"); 
     try 
     { 
      Log.d(TAG, "FileExplorer: reading data"); 
      dirs = (Vector<String>) ConnectionThread.din.readObject(); 
      Log.d(TAG, "FileExplorer: read data"); 
      arrayAdapter = new ArrayAdapter<String>(this, 
            android.R.layout.activity_list_item, 
            android.R.id.text2 , dirs);    
      Log.d(TAG, "FileExplorer: ArrayAdapter created"); 

      handler.post(new Runnable() { 
       public void run() 
       { 
        Log.d(TAG, "FileExplorer: In handler Thread"); 
        direc.setAdapter(arrayAdapter); 
        Log.d(TAG, "FileExplorer: Updated UI"); 
       } 
      }); 

      Log.d(TAG, "FileExplorer: Directory set"); 
     }catch (Exception e) { 
      Log.d(TAG, "FileExplorerActivity: Exception:"+e.getMessage()); 
     } 
    } 
} 

这里是logcat中有说:

> 1. 05-24 20:14:46.601 7759 7834 D ricky : FileExplorer: Thread started 
> 2. 05-24 20:14:46.601 7759 7834 D ricky : FileExplorer: reading data 
> 3. 05-24 20:14:46.648 7759 7834 D ricky : FileExplorer: read data 
> 4. 05-24 20:14:46.648 7759 7834 D ricky : FileExplorer: ArrayAdapter created 
> 5. 05-24 20:14:46.648 7759 7834 D ricky : FileExplorer: Directory set 
> 6. 05-24 20:14:46.656 7759 7759 D ricky : FileExplorer: In handler Thread 
> 7. 05-24 20:14:46.656 7759 7759 D ricky : FileExplorer: Updated UI 
> 8. 05-24 20:14:46.664 7759 7759 D AndroidRuntime: Shutting down VM 
> 9. 05-24 20:14:46.664 7759 7759 W dalvikvm: threadid=1: thread exiting with uncaught 10. exception (group=0x4001e560) 
> 11. 05-24 20:14:46.687 7759 7759 E AndroidRuntime: FATAL EXCEPTION: main 
> 12. 05-24 20:14:46.687 7759 7759 E AndroidRuntime: java.lang.NullPointerException 
> 13. 05-24 20:14:46.687 7759 7759 E AndroidRuntime:  at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:353) 
> 14. 05-24 20:14:46.687 7759 7759 E AndroidRuntime:  at android.widget.ArrayAdapter.getView(ArrayAdapter.java:323) 
> 15. 05-24 20:14:46.687 7759 7759 E AndroidRuntime:  at android.widget.AbsListView.obtainView(AbsListView.java:1456) 
> 16. 05-24 20:14:46.687 7759 7759 E AndroidRuntime:  at android.widget.ListView.measureHeightOfChildren(ListView.java :1291) 
> 17. 05-24 20:14:46.687 7759 7759 E AndroidRuntime:  at android.widget.ListView.onMeasure(ListView.java:1202) 
> 18. 05-24 20:14:46.687 7759 7759 E AndroidRuntime:  at android.view.View.measure(View.java:8355) 
> 19. 05-24 20:14:46.687 7759 7759 E AndroidRuntime:  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java :3279) 
> 20. 05-24 20:14:46.687 7759 7759 E AndroidRuntime:  at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1017) 
> 21. 05-24 20:14:46.687 7759 7759 E AndroidRuntime:  at android.widget.LinearLayout.measureHorizontal(LinearLayout.ja va:701) 
> 22. 05-24 20:14:46.687 7759 7759 E AndroidRuntime:  at android.widget.LinearLayout.onMeasure(LinearLayout.java:311) 
> 23. 05-24 20:14:46.687 7759 7759 E AndroidRuntime:  at android.view.View.measure(View.java:8355) 
> 24. 05-24 20:14:46.687 7759 7759 E AndroidRuntime:  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java :3279) 
> 25. 05-24 20:14:46.687 7759 7759 E AndroidRuntime:  at android.widget.FrameLayout.onMeasure(FrameLayout.java:250) 
> 26. 05-24 20:14:46.687 7759 7759 E AndroidRuntime:  at android.view.View.measure(View.java:8355) 
> 27. 05-24 20:14:46.687 7759 7759 E AndroidRuntime:  at android.widget.LinearLayout.measureVertical(LinearLayout.java :531) 
> 28. 05-24 20:14:46.687 7759 7759 E AndroidRuntime:  at android.widget.LinearLayout.onMeasure(LinearLayout.java:309) 
> 29. 05-24 20:14:46.687 7759 7759 E AndroidRuntime:  at android.view.View.measure(View.java:8355) 
> 30. 05-24 20:14:46.687 7759 7759 E AndroidRuntime:  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java :3279) 
> 31. 05-24 20:14:46.687 7759 7759 E AndroidRuntime:  at android.widget.FrameLayout.onMeasure(FrameLayout.java:250) 
> 32. 05-24 20:14:46.687 7759 7759 E AndroidRuntime:  at android.view.View.measure(View.java:8355) 
> 33. 05-24 20:14:46.687 7759 7759 E AndroidRuntime:  at android.view.ViewRoot.performTraversals(ViewRoot.java:882) 
> 34. 05-24 20:14:46.687 7759 7759 E AndroidRuntime:  at android.view.ViewRoot.handleMessage(ViewRoot.java:1917) 
> 35. 05-24 20:14:46.687 7759 7759 E AndroidRuntime:  at android.os.Handler.dispatchMessage(Handler.java:99) 
> 36. 05-24 20:14:46.687 7759 7759 E AndroidRuntime:  at android.os.Looper.loop(Looper.java:130) 
> 37. 05-24 20:14:46.687 7759 7759 E AndroidRuntime:  at android.app.ActivityThread.main(ActivityThread.java:3859) 
> 38. 05-24 20:14:46.687 7759 7759 E AndroidRuntime:  at java.lang.reflect.Method.invokeNative(Native Method) 
> 39. 05-24 20:14:46.687 7759 7759 E AndroidRuntime:  at java.lang.reflect.Method.invoke(Method.java:507) 
> 40. 05-24 20:14:46.687 7759 7759 E AndroidRuntime:  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
> 41. 05-24 20:14:46.687 7759 7759 E AndroidRuntime:  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
> 42. 05-24 20:14:46.687 7759 7759 E AndroidRuntime:  at dalvik.system.NativeStart.main(Native Method) 
+0

确保“dirs”不为空 – dymmeh

+0

没有dirs不为空...已经测试过它对if(dirs == null)并且它不是... dirs还有所有行... i已经将它打印成实际的程序。 – Anjanu

+0

R.layout.fileexplorer包含R.id.directoriesss? – Blackbelt

回答

1

注意线在该NullPointerException发生:

android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:353)


这是因为android.R.layout.activity_list_item不包含android.R.id.text2

您可以改为使用android.R.id.text1或用simple_list_item_2替换行布局。

我会建议创建自己的行布局,以避免这些情况摆在首位。

+0

是的,该异常消失后使用android.R.id.text1 insted的text2 ...谢谢很多车...但为什么Listview的direc没有更新Vector Dirs中包含的行......它有行。 – Anjanu

+1

不确定,正如大卫提到的,你可能不得不在UI线程上创建它。另外,你的静态引用'arrayAdapter'会导致内存泄漏,因为它持有对活动的引用。使'arrayAdapter'成为一个非静态的引用(就像所有持有对'Context'的引用的对象一样)。 –

+1

是的大卫是正确的...它的工作... – Anjanu

0

移动这个

arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.activity_list_item, 
     android.R.id.text2 , dirs); 

您的run()方法的内部,使得它运行在UI线程上。你不应该在UI线程之外创建一个ArrayAdapter。

+0

先生其实arrayAdapter =新ArrayAdapter (this,android.R.layout.activity_list_item,android.R.id.text2,dirs); 这是异常的来源android.R.id.text1 instedof text2解决了它... – Anjanu

+0

好吧,那很好。我仍然会在UI线程上创建ArrayAdapter。很高兴你能解决你的问题。 –

+0

雅我照你说的... – Anjanu