2013-06-26 5 views
1

Я получаю сообщение об ошибке Main NI Thread, я не уверен, где я должен поместить класс AsyncTask в этот код. Должен ли он быть в классе LoginActivity, классе UserFunction или классе JSONParser , и мне также нужна помощь в определении структуры AsyncTask. Я пытался вариации человека у, но я не могу понять этоГде разместить AsyncTask

Спасибо

LoginActivity Класс

ALL OTHER IMPORTS 
import com.example.login.DatabaseHandler; 
import com.example.login.UserFunctions; 

public class LoginActivity extends Activity { 
Button btnLogin; 
Button btnLinkToRegister; 
EditText inputEmail; 
EditText inputPassword; 
TextView loginErrorMsg; 

// JSON Response node names 
private static String KEY_SUCCESS = "success"; 
private static String KEY_ERROR = "error"; 
private static String KEY_ERROR_MSG = "error_msg"; 
private static String KEY_UID = "uid"; 
private static String KEY_NAME = "name"; 
private static String KEY_EMAIL = "email"; 
private static String KEY_CREATED_AT = "created_at"; 

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

    // Importing all assets like buttons, text fields 
    inputEmail = (EditText) findViewById(R.id.loginEmail); 
    inputPassword = (EditText) findViewById(R.id.loginPassword); 
    btnLogin = (Button) findViewById(R.id.btnLogin); 
    btnLinkToRegister = (Button) findViewById(R.id.btnLinkToRegisterScreen); 
    loginErrorMsg = (TextView) findViewById(R.id.login_error); 

    // Login button Click Event 
    btnLogin.setOnClickListener(new View.OnClickListener() { 

     public void onClick(View view) { 
      String email = inputEmail.getText().toString(); 
      String password = inputPassword.getText().toString(); 
      UserFunctions userFunction = new UserFunctions(); 
      JSONObject json = userFunction.loginUser(email, password); 


      // check for login response 
      try { 
       if (json.getString(KEY_SUCCESS) != null) { 
        loginErrorMsg.setText(""); 
        String res = json.getString(KEY_SUCCESS); 
        if(Integer.parseInt(res) == 1){ 
         // user successfully logged in 
         // Store user details in SQLite Database 
         DatabaseHandler db = new  DatabaseHandler(getApplicationContext()); 
         JSONObject json_user = json.getJSONObject("user"); 

         // Clear all previous data in database 
         userFunction.logoutUser(getApplicationContext()); 
         db.addUser(json_user.getString(KEY_NAME), json_user.getString(KEY_EMAIL), json.getString(KEY_UID), json_user.getString(KEY_CREATED_AT));      

         // Launch Dashboard Screen 
         Intent dashboard = new Intent(getApplicationContext(), DashboardActivity.class); 

         // Close all views before launching Dashboard 
         dashboard.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
         startActivity(dashboard); 

         // Close Login Screen 
         finish(); 
        }else{ 
         // Error in login 
         loginErrorMsg.setText("Incorrect username/password"); 
        } 
       } 
      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 
     } 
    }); 

Пользовательская функция класса

ALL IMPORTS 

public class UserFunctions { 

private JSONParser jsonParser; 

// Testing in localhost using wamp or xampp 
// use http://10.0.2.2/ to connect to your localhost ie http://localhost/ 
private static String loginURL = "http://10.0.2.2/loginform/reg_login/index.php/"; 
private static String registerURL = "http://10.0.2.2/loginform/reg_login/index.php/"; 

private static String login_tag = "login"; 
private static String register_tag = "register"; 

// constructor 
public UserFunctions(){ 
    jsonParser = new JSONParser(); 
} 

/** 
* function make Login Request 
* @param email 
* @param password 
* */ 



    public JSONObject loginUser(String email, String password){ 


    // Building Parameters 
    List<NameValuePair> params1 = new ArrayList<NameValuePair>(); 
    params1.add(new BasicNameValuePair("tag", login_tag)); 
    params1.add(new BasicNameValuePair("email", email)); 
    params1.add(new BasicNameValuePair("password", password)); 

    // return json 
    // Log.e("JSON", json.toString()); 

     JSONObject json = jsonParser.getJSONFromUrl(loginURL, params1); 
    return json; 
    } 

JSONParser Class

public class JSONParser { 

static InputStream is = null; 
static JSONObject jObj = null; 
static String json = ""; 

// constructor 
public JSONParser() { 

} 

public JSONObject getJSONFromUrl(String url, List<NameValuePair> params) { 

    // Making HTTP request 
    try { 
     // defaultHttpClient 
     DefaultHttpClient httpClient = new DefaultHttpClient(); 
     HttpPost httpPost = new HttpPost(url); 
     httpPost.setEntity(new UrlEncodedFormEntity(params)); 

     HttpResponse httpResponse = httpClient.execute(httpPost); 
     HttpEntity httpEntity = httpResponse.getEntity(); 
     is = httpEntity.getContent(); 

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

    try { 
     BufferedReader reader = new BufferedReader(new InputStreamReader(
       is, "iso-8859-1"), 8); 
     StringBuilder sb = new StringBuilder(); 
     String line = null; 
     while ((line = reader.readLine()) != null) { 
      sb.append(line + "n"); 
     } 
     is.close(); 
     json = sb.toString(); 
     Log.e("JSON", json); 
    } catch (Exception e) { 
     Log.e("Buffer Error", "Error converting result " + e.toString()); 
    } 

    // try parse the string to a JSON object 
    try { 
     jObj = new JSONObject(json);   
    } catch (JSONException e) { 
     Log.e("JSON Parser", "Error parsing data " + e.toString()); 
    } 

    // return JSON String 
    return jObj; 

    } 
} 

ответ

1

Поскольку вы не можете выполнять сетевые операции в основном потоке пользовательского интерфейса, используйте asynctask, где вы выполнили сетевые операции.

Если я не ошибаюсь, ваш getJSONFromUrl выполняет только сетевые операции. Так называют это используя AsyncTask

+0

Благодарим вас за ответ. – user2510952

+0

Это именно то место, где я пытался разместить AsyncTask, но у меня возникли трудности с правильной их компоновкой и передачей параметров – user2510952

+0

проверить асинхронный документ http://developer.android.com/reference/android/os/AsyncTask.html. ......... используйте это и опубликуйте обновленный код, если все еще проблема – stinepike

0

попробовать это

public class Login extends AsyncTask<Void, Void, Boolean> { 
    private String email; 
    private String password; 
    private JSONObject json; 
    public Login(String email, String password) { 
     this.email = email; 
     this.password = password; 
    } 
    @Override 
    protected Boolean doInBackground(Void... params) { 
     UserFunctions userFunction = new UserFunctions(); 
     JSONObject json = userFunction.loginUser(email, password); 
     return true; 

    } 

    @Override 
    protected void onPostExecute(Boolean status) { 
     try { 
       if (json.getString(KEY_SUCCESS) != null) { 
        loginErrorMsg.setText(""); 
        String res = json.getString(KEY_SUCCESS); 
        if(Integer.parseInt(res) == 1){ 
         // user successfully logged in 
         // Store user details in SQLite Database 
         DatabaseHandler db = new  DatabaseHandler(getApplicationContext()); 
         JSONObject json_user = json.getJSONObject("user"); 

         // Clear all previous data in database 
         userFunction.logoutUser(getApplicationContext()); 
         db.addUser(json_user.getString(KEY_NAME), json_user.getString(KEY_EMAIL), json.getString(KEY_UID), json_user.getString(KEY_CREATED_AT));      

         // Launch Dashboard Screen 
         Intent dashboard = new Intent(getApplicationContext(), DashboardActivity.class); 

         // Close all views before launching Dashboard 
         dashboard.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
         startActivity(dashboard); 

         // Close Login Screen 
         finish(); 
        }else{ 
         // Error in login 
         loginErrorMsg.setText("Incorrect username/password"); 
        } 
       } 
      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 
    } 

} 

в основном просто поставить процесс сети в doinBackground и другой процесс после получения данных в onPostExecute

и в методе OnClick просто называют этот класс, используя

new Login(email,password).execute(); 

надеюсь, что это поможет

+0

Да, это так, спасибо большое, мне пришлось внести небольшие изменения, чтобы заставить его работать, но все хорошо – user2510952

Смежные вопросы