2013-06-26 90 views
1

我得到一個有關主UI線程的錯誤,我不知道我應該在這個代碼中放置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(); 
      } 
     } 
    }); 

UserFunction類

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類

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

由於您無法在主UI線程中執行網絡操作,因此請在執行網絡操作的地方使用asynctask。

如果我沒有錯,你的getJSONFromUrl只做網絡操作。所以稱它爲使用的AsyncTask

+0

感謝您回答。 – user2510952

+0

這正是我一直試圖放置AsyncTask的地方,但我很難將它正確地放在一起,並通過參數 – user2510952

+0

檢查asynctask文檔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