2011-12-23 40 views
8

Tôi gặp sự cố với chức năng đăng nhập Android của mình, nhận được android.os.NetworkOnMainThreadExceptionandroid.os.NetworkOnMainThreadException. Cần sử dụng tác vụ không đồng bộ?

Tôi đã xóa trường mật khẩu chỉ để kiểm tra xem tên người dùng có được đăng hay không, tôi biết rằng đây là vấn đề đối với android 3.2 +.

Đây là mã của tôi:

package com.example.toknapp; 

import java.util.ArrayList; 

public class login2 extends Activity { 
    EditText un; 
    TextView error; 
    Button ok; 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.login); 
     un=(EditText)findViewById(R.id.et_un); 
     ok=(Button)findViewById(R.id.btn_login); 
     error=(TextView)findViewById(R.id.tv_error); 

     ok.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 

       ArrayList<NameValuePair> postParameters = new ArrayList<NameValuePair>(); 
       postParameters.add(new BasicNameValuePair("username", un.getText().toString())); 
       //String valid = "1"; 
       String response = null; 
       try { 
        response = CustomHttpClient.executeHttpPost("http://tokn.me/android_merchant_login.php", postParameters); 
        String res=response.toString(); 
        // res = res.trim(); 
        res= res.replaceAll("\\s+","");        
        //error.setText(res); 

        if(res.equals("1")) 
         error.setText("Correct Username or Password"); 
        else 
         error.setText("Sorry!! Incorrect Username or Password"); 
       } catch (Exception e) { 
        un.setText(e.toString()); 
       } 

      } 
     }); 
    } 
} 


package com.example.toknapp; 

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.net.URI; 
import java.util.ArrayList; 

import org.apache.http.HttpResponse; 
import org.apache.http.NameValuePair; 
import org.apache.http.client.HttpClient; 
import org.apache.http.client.entity.UrlEncodedFormEntity; 
import org.apache.http.client.methods.HttpGet; 
import org.apache.http.client.methods.HttpPost; 
import org.apache.http.conn.params.ConnManagerParams; 
import org.apache.http.impl.client.DefaultHttpClient; 
import org.apache.http.params.HttpConnectionParams; 
import org.apache.http.params.HttpParams; 

public class CustomHttpClient { 
    /** The time it takes for our client to timeout */ 
    public static final int HTTP_TIMEOUT = 30 * 1000; // milliseconds 

    /** Single instance of our HttpClient */ 
    private static HttpClient mHttpClient; 

    /** 
    * Get our single instance of our HttpClient object. 
    * 
    * @return an HttpClient object with connection parameters set 
    */ 
    private static HttpClient getHttpClient() { 
     if (mHttpClient == null) { 
      mHttpClient = new DefaultHttpClient(); 
      final HttpParams params = mHttpClient.getParams(); 
      HttpConnectionParams.setConnectionTimeout(params, HTTP_TIMEOUT); 
      HttpConnectionParams.setSoTimeout(params, HTTP_TIMEOUT); 
      ConnManagerParams.setTimeout(params, HTTP_TIMEOUT); 
     } 
     return mHttpClient; 
    } 

    /** 
    * Performs an HTTP Post request to the specified url with the 
    * specified parameters. 
    * 
    * @param url The web address to post the request to 
    * @param postParameters The parameters to send via the request 
    * @return The result of the request 
    * @throws Exception 
    */ 
    public static String executeHttpPost(String url, ArrayList<NameValuePair> postParameters) throws Exception { 
     BufferedReader in = null; 
     try { 
      HttpClient client = getHttpClient(); 
      HttpPost request = new HttpPost(url); 
      UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(postParameters); 
      request.setEntity(formEntity); 
      HttpResponse response = client.execute(request); 
      in = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); 

      StringBuffer sb = new StringBuffer(""); 
      String line = ""; 
      String NL = System.getProperty("line.separator"); 
      while ((line = in.readLine()) != null) { 
       sb.append(line + NL); 
      } 
      in.close(); 

      String result = sb.toString(); 
      return result; 
     } finally { 
      if (in != null) { 
       try { 
        in.close(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
    } 

    /** 
    * Performs an HTTP GET request to the specified url. 
    * 
    * @param url The web address to post the request to 
    * @return The result of the request 
    * @throws Exception 
    */ 
    public static String executeHttpGet(String url) throws Exception { 
     BufferedReader in = null; 
     try { 
      HttpClient client = getHttpClient(); 
      HttpGet request = new HttpGet(); 
      request.setURI(new URI(url)); 
      HttpResponse response = client.execute(request); 
      in = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); 

      StringBuffer sb = new StringBuffer(""); 
      String line = ""; 
      String NL = System.getProperty("line.separator"); 
      while ((line = in.readLine()) != null) { 
       sb.append(line + NL); 
      } 
      in.close(); 

      String result = sb.toString(); 
      return result; 
     } finally { 
      if (in != null) { 
       try { 
        in.close(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
    } 
} 
+0

bạn tự trả lời. Sử dụng tác vụ không đồng bộ! – rDroid

+0

Tôi không biết ở đâu, Im rất mới phát triển Android. Điều duy nhất tôi đã làm cho đến nay là thực hiện một bố cục theo thẻ và chỉnh sửa tệp main.xml: p – re1man

Trả lời

10

Tôi đoán bạn đang cố gắng để peform một số hoạt động mạng về chủ đề chính của bạn

NetworkOnMainThreadException từ Documents

Trường hợp ngoại lệ được ném ra khi một ứng dụng cố gắng thực hiện hoạt động mạng trên chủ đề chính của nó.

UPDATE:

của nó tốt hơn để sử dụng AsyncTask

private class MyAsyncTask extends AsyncTask<Void, Void, Void> 
    { 

     ProgressDialog mProgressDialog; 
     @Override 
     protected void onPostExecute(Void result) { 
      mProgressDialog.dismiss(); 
     } 

     @Override 
     protected void onPreExecute() { 
      mProgressDialog = ProgressDialog.show(ActivityName.this, 
              "Loading...", "Data is Loading..."); 
     } 

     @Override 
     protected Void doInBackground(Void... params) { 
      // your network operation 
      return null; 
     } 
    } 
+0

có, nó được tuyên bố rằng tôi phải sử dụng tác vụ không đồng bộ. Chỉ cần biết cách thức hoạt động trong> 3.2 – re1man

+0

Tham khảo Tài liệu cho [AsyncTask] (http://developer.android.com/reference/android/os/AsyncTask.html) giải thích độc đáo –

+0

thanh toán [tại đây] (http : //stackoverflow.com/questions/8515377/launching-a-long-running-task-from-an-alertdialog-android/8515395#8515395) cách sử dụng AsyncTask. –

0

Vui lòng kiểm tra link này. nó mô tả tất cả những gì bạn cần làm.

[sửa]

Dường như họ đã thay đổi trang. Điều này link sẽ chỉ cho bạn cách sử dụng các tác vụ không đồng bộ

+1

không hoạt động .... – Ahmad

+1

Có thể là địa chỉ này: http://android-developers.blogspot.co.uk/2009/05/painless-threading.html – DilbertDave

2

Chỉ cần thay đổi phiên bản đích trong tệp kê khai thành người yêu hơn Honeycomb.

<uses-sdk 
    android:minSdkVersion="8" 
    android:targetSdkVersion="8" /> 

Chỉnh sửa: Nhưng việc sử dụng AsyncTask là cách thuận tiện hơn để giải quyết vấn đề này.

+0

+1 vì nó giải quyết được lỗi. Nhưng tốt hơn là sử dụng các tác vụ không đồng bộ. – pocjoc

+0

Điều này không giải quyết được vấn đề mà bạn không nên chặn ứng dụng của mình bằng tác vụ đồng bộ. – utopalex

Các vấn đề liên quan