2012-09-18 71 views
0

网址登录我按照这个教程,并得到错误Android Login Screen Using HttpClient错误时,在安卓

为什么我不能登录?我的目标版本是targetSdkVersion 15和minSdkVersion 12.按按钮登录时这是错误的。

MainActivity

public class MainActivity extends Activity implements OnClickListener { 

Button ok, back, exit; 
TextView result; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    ok = (Button) findViewById(R.id.btn_login); 
    ok.setOnClickListener(this); 
    result = (TextView) findViewById(R.id.lbl_result); 
} 

public void postLoginData() { 
    HttpClient httpclient = new DefaultHttpClient(); 
    HttpPost httppost = new HttpPost("http://www.sencide.com/blog/login.php"); 

    try { 
     EditText uname = (EditText) findViewById(R.id.txt_username); 
     String username = uname.getText().toString(); 

     EditText pword = (EditText) findViewById(R.id.txt_password); 
     String password = pword.getText().toString(); 

     List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2); 
     nameValuePairs.add(new BasicNameValuePair("username", username)); 
     nameValuePairs.add(new BasicNameValuePair("password", password)); 
     httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 

     Log.w("SENCIDE", "Execute HTTP Post Request"); 
     HttpResponse response = httpclient.execute(httppost); 

     String str = inputStreamToString(response.getEntity().getContent()).toString(); 
     Log.w("SENCIDE", str); 

     if (str.toString().equalsIgnoreCase("true")) { 
      Log.w("SENCIDE", "TRUE"); 
      result.setText("Login successful"); 
     } else { 
      Log.w("SENCIDE", "FALSE"); 
      result.setText(str); 
     } 

    } catch (ClientProtocolException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

private StringBuilder inputStreamToString(InputStream is) { 
    String line = ""; 
    StringBuilder total = new StringBuilder(); 
    BufferedReader rd = new BufferedReader(new InputStreamReader(is)); 
    try { 
     while ((line = rd.readLine()) != null) { 
      total.append(line); 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    return total; 
} 

public void onClick(View view) { 
    if (view == ok) { 
     postLoginData(); 
    } 
    } 
} 

ERROR

09-18 10:50:40.531: E/AndroidRuntime(23081): FATAL EXCEPTION: main 
09-18 10:50:40.531: E/AndroidRuntime(23081): android.os.NetworkOnMainThreadException 
09-18 10:50:40.531: E/AndroidRuntime(23081): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1099) 
09-18 10:50:40.531: E/AndroidRuntime(23081): at java.net.InetAddress.lookupHostByName(InetAddress.java:391) 
09-18 10:50:40.531: E/AndroidRuntime(23081): at java.net.InetAddress.getAllByNameImpl(InetAddress.java:242) 
09-18 10:50:40.531: E/AndroidRuntime(23081): at java.net.InetAddress.getAllByName(InetAddress.java:220) 
09-18 10:50:40.531: E/AndroidRuntime(23081): at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:137) 
09-18 10:50:40.531: E/AndroidRuntime(23081): at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164) 
09-18 10:50:40.531: E/AndroidRuntime(23081): at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119) 
09-18 10:50:40.531: E/AndroidRuntime(23081): at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360) 
09-18 10:50:40.531: E/AndroidRuntime(23081): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555) 
09-18 10:50:40.531: E/AndroidRuntime(23081): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487) 
09-18 10:50:40.531: E/AndroidRuntime(23081): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465) 
09-18 10:50:40.531: E/AndroidRuntime(23081): at com.example.login.MainActivity.postLoginData(MainActivity.java:63) 
09-18 10:50:40.531: E/AndroidRuntime(23081): at com.example.login.MainActivity.onClick(MainActivity.java:101) 
09-18 10:50:40.531: E/AndroidRuntime(23081): at android.view.View.performClick(View.java:3558) 
09-18 10:50:40.531: E/AndroidRuntime(23081): at android.view.View$PerformClick.run(View.java:14157) 
09-18 10:50:40.531: E/AndroidRuntime(23081): at android.os.Handler.handleCallback(Handler.java:605) 
09-18 10:50:40.531: E/AndroidRuntime(23081): at android.os.Handler.dispatchMessage(Handler.java:92) 
09-18 10:50:40.531: E/AndroidRuntime(23081): at android.os.Looper.loop(Looper.java:137) 
09-18 10:50:40.531: E/AndroidRuntime(23081): at android.app.ActivityThread.main(ActivityThread.java:4514) 
09-18 10:50:40.531: E/AndroidRuntime(23081): at java.lang.reflect.Method.invokeNative(Native Method) 
09-18 10:50:40.531: E/AndroidRuntime(23081): at java.lang.reflect.Method.invoke(Method.java:511) 
09-18 10:50:40.531: E/AndroidRuntime(23081): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:790) 
09-18 10:50:40.531: E/AndroidRuntime(23081): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557) 
09-18 10:50:40.531: E/AndroidRuntime(23081): at dalvik.system.NativeStart.main(Native Method) 
+0

//我觉得这是你 http://stackoverflow.com/questions/12327625/error-when-get-html-from-web-in-android/12328074#12328074 –

+0

你应该有帮助在主线程中使用asyantask这个服务调用。所以你有问题你使用asyntask doInbackground调用服务 – QuokMoon

回答

0

不要写在主UI线程网络通话。而不是使用asynctask或其他theread。

0

这个问题的两个解决方案。

1)不要在主UI线程中使用异步任务编写网络调用。

2)编写下面的代码后setContentView(R.layout.activity_main);

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

FYI到您的MainActivity文件,NetworkOnMainThreadException可从API 11,如果你正在长时间运行的主线程本身内的任务,它不会让你这样做。

为了解决上述问题,尽量使AsyncTaskdoInBackground()方法内部Web服务调用或长期运行的任务。 FYI,其在Android中的Painless Threading

例如:

打电话给你POSTDATA()doInBackground()内部方法,并执行基于按钮点击此的AsyncTask类。