无法在未调用Looper.prepare() - setListAdapter的线程内创建处理程序

时间:2015-03-12 12:50:15

标签: android multithreading

我试图在线程内部调用setListAdapter来显示列表。我知道我无法从UI线程外部访问Android UI,因此我使用runOnUiThread,但我仍然得到异常:无法在未调用Looper.prepare的线程内创建处理程序()。任何人都可以告诉我为什么以及如何解决它?谢谢!

这是我的代码:

 public void checkLoginInformation(View view)
    { client_th = new Thread( new Runnable()
        {
            public void run()
            {
                try
                {
                    cs = new Socket("192.168.0.101",2014);
                    final DataOutputStream os = new DataOutputStream(cs.getOutputStream());
                    final DataInputStream is = new DataInputStream(cs.getInputStream());
                    String msg = is.readUTF();
                    if(msg.equals("logat"))
                    {
                       final ShowList l = new ShowList();
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run()
                            {
                                l.show();
                            }
                        });
                     }
                 }
                catch (Exception e)
                {
                    e.printStackTrace();
                }
            }
        });
        client_th.start();
    }

ShowList类:

public class ShowList extends ListActivity
{
    private final String [] online_drivers = {"one","two","three"};
    private final Context context = this;

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.online_window);
    }

    public void show()
    {

       setListAdapter(new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_1,
                online_drivers));

    }
}

我得到的例外:

03-12 08:22:03.096    1895-1914/com.example.irinab.licenta2 W/System.err﹕ java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
03-12 08:22:03.096    1895-1914/com.example.irinab.licenta2 W/System.err﹕ at android.os.Handler.<init>(Handler.java:200)
03-12 08:22:03.096    1895-1914/com.example.irinab.licenta2 W/System.err﹕ at android.os.Handler.<init>(Handler.java:114)
03-12 08:22:03.096    1895-1914/com.example.irinab.licenta2 W/System.err﹕ at android.app.Activity.<init>(Activity.java:765)
03-12 08:22:03.096    1895-1914/com.example.irinab.licenta2 W/System.err﹕ at android.app.ListActivity.<init>(ListActivity.java:175)
03-12 08:22:03.096    1895-1914/com.example.irinab.licenta2 W/System.err﹕ at com.example.irinab.licenta2.ShowList.<init>(ShowList.java:14)
03-12 08:22:03.096    1895-1914/com.example.irinab.licenta2 W/System.err﹕ at com.example.irinab.licenta2.MainActivity$1.run(MainActivity.java:120)
03-12 08:22:03.096    1895-1914/com.example.irinab.licenta2 W/System.err﹕ at java.lang.Thread.run(Thread.java:841)

2 个答案:

答案 0 :(得分:0)

下面:

final ShowList l = new ShowList();

创建ShowList Activity的对象,通过调用show方法显示ListView。

使用startActivity启动ShowList活动:

intent = new Intent(view.getContext(),
                    ShowList.class);
view.getContext().startActivity(intent);

答案 1 :(得分:0)

这个final ShowList l = new ShowList();不是你应该如何开始一个新的活动。 要开始ShowList活动,请执行以下操作:

Intent startShowListIntent = new Intent(MainActivity.this, ShowList.class);
startActivity(startShowListIntent);

在上面的代码段中,我假设您当前活动的名称为MainActivity