10

我知道你不能在主线程中进行网络操作,因为 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();
    }
});

但是,尽管我不在主线程上,但我还是收到了这个异常(或者至少我认为......)

4

3 回答 3

50

usingrun()不会启动单独的线程,它实际上会在启动它的同一线程上启动一个可运行的线程。

你需要用来start()启动一个新线程。

于 2013-09-09T14:14:56.663 回答
0

这些线

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

需要UI ThreadrunOnUiThread(). Toast是一个UI元素。

于 2013-09-09T14:09:38.183 回答
-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

于 2013-09-09T14:21:09.700 回答