我知道自从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();
}
});
但是,尽管我在主线程上不(或者至少我认为......),但我收到了这个例外。
答案 0 :(得分:45)
使用run()
不会启动单独的线程,它实际上在启动它的同一个线程上启动了runnable。
您需要使用start()
来启动新主题。
答案 1 :(得分:0)
这些行
Toast toast=Toast.makeText(c, getString(R.string.welcome), Toast.LENGTH_LONG);
toast.show();
需要在UI Thread
上运行,因为您使用runOnUiThread()
在其下方进行了几次。 Toast
是UI
元素。
答案 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。