android.os.networkonmainthreadexception在新的Thread中

时间:2013-09-09 14:07:12

标签: android multithreading

我知道自从Android 3.0以来你无法在主线程中进行网络操作。所以,我在一个新的Thread

中打了个电话
button.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View v) {
        user=login.getText().toString();
        password=pass.getText().toString();
        params.add(new BasicNameValuePair("user", user));
        params.add(new BasicNameValuePair("pass", password));
        Thread thread=new Thread(){
            public void run(){
                try {
                    // Throws exception here
                    response=CustomHttpClient.executeHttpPost(urlogin, params); 
                    response=response.replaceAll("\\s+","");

                } catch (Exception e) {
                    e.printStackTrace();
                }
                if(response.equals("ok")){

                    Intent home=new Intent(c, HomeActivity.class);
                    home.putExtra("username", user);
                    startActivity(home);
                    Toast toast=Toast.makeText(
                        c, getString(R.string.welcome), Toast.LENGTH_LONG);
                    toast.show();
                }else{
                    if(response.equals("fallo")){
                        runOnUiThread(new Runnable() {

                            @Override
                            public void run() {
                                Toast toast=Toast.makeText(
                                    c, R.string.nologin, Toast.LENGTH_LONG);
                                toast.show();
                                login.setText("");
                                pass.setText("");
                            }
                        });
                    }else if(response.equals("nologin")){
                        runOnUiThread(new Runnable() {

                            @Override
                            public void run() {
                                Toast toast=Toast.makeText(
                                    c, R.string.nouser, Toast.LENGTH_LONG);
                                toast.show();
                                login.setText("");
                                pass.setText("");

                            }
                        });
                    }
                }
            }
        };
        thread.run();
    }
});

但是,尽管我在主线程上(或者至少我认为......),但我收到了这个例外。

3 个答案:

答案 0 :(得分:45)

使用run()不会启动单独的线程,它实际上在启动它的同一个线程上启动了runnable。

您需要使用start()来启动新主题。

答案 1 :(得分:0)

这些行

Toast toast=Toast.makeText(c, getString(R.string.welcome), Toast.LENGTH_LONG);
toast.show();

需要在UI Thread上运行,因为您使用runOnUiThread()在其下方进行了几次。 ToastUI元素。

答案 2 :(得分:-2)

您可以使用此代码

if (android.os.Build.VERSION.SDK_INT > 9) {
    StrictMode.ThreadPolicy policy = 
        new StrictMode.ThreadPolicy.Builder().permitAll().build();
    StrictMode.setThreadPolicy(policy);
}

以避免SDK>的异常9您需要在除UI之外的单独线程上执行网络操作,或者您可以使用AsyncTask