Android 在哪里放置异步任务
我得到了一个关于主UI线程的错误,我不确定应该将AsyncTask类放在这段代码中的什么位置。 它应该在LoginActivity类、UserFunction类还是JSONParser类中 我还需要帮助了解如何构造异步任务。我一直在尝试各种变化,但我想不出来 多谢各位 逻辑活动类Android 在哪里放置异步任务,android,android-asynctask,Android,Android Asynctask,我得到了一个关于主UI线程的错误,我不确定应该将AsyncTask类放在这段代码中的什么位置。 它应该在LoginActivity类、UserFunction类还是JSONParser类中 我还需要帮助了解如何构造异步任务。我一直在尝试各种变化,但我想不出来 多谢各位 逻辑活动类 ALL OTHER IMPORTS import com.example.login.DatabaseHandler; import com.example.login.UserFunctions; public c
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 JSONParser;
//使用wamp或xampp在本地主机中进行测试
//使用http://10.0.2.2/ 要连接到本地主机,请执行以下操作:http://localhost/
专用静态字符串loginURL=”http://10.0.2.2/loginform/reg_login/index.php/";
专用静态字符串注册表URL=”http://10.0.2.2/loginform/reg_login/index.php/";
私有静态字符串login_tag=“login”;
专用静态字符串寄存器\u tag=“寄存器”;
//建造师
公共用户函数(){
jsonParser=新的jsonParser();
}
/**
*函数发出登录请求
*@param电子邮件
*@param密码
* */
公共JSONObject登录用户(字符串电子邮件、字符串密码){
//建筑参数
List params1=new ArrayList();
参数1.add(新的BasicNameValuePair(“tag”,login_tag));
参数1.add(新的BasicNameValuePair(“email”,email));
参数1.add(新的BasicNameValuePair(“密码”,password));
//返回json
//Log.e(“JSON”,JSON.toString());
JSONObject json=jsonParser.getJSONFromUrl(loginURL,params1);
返回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;
}
}
公共类JSONParser{
静态InputStream为空;
静态JSONObject jObj=null;
静态字符串json=“”;
//建造师
公共JSONParser(){
}
公共JSONObject getJSONFromUrl(字符串url,列表参数){
//发出HTTP请求
试一试{
//defaultHttpClient
DefaultHttpClient httpClient=新的DefaultHttpClient();
HttpPost HttpPost=新的HttpPost(url);
setEntity(新的UrlEncodedFormEntity(参数));
HttpResponse HttpResponse=httpClient.execute(httpPost);
HttpEntity HttpEntity=httpResponse.getEntity();
is=httpEntity.getContent();
}捕获(不支持的编码异常e){
e、 printStackTrace();
}捕获(客户端协议例外e){
e、 printStackTrace();
}捕获(IOE异常){
e、 printStackTrace();
}
试一试{
BufferedReader reader=新的BufferedReader(新的InputStreamReader(
is,“iso-8859-1”),8);
StringBuilder sb=新的StringBuilder();
字符串行=null;
而((line=reader.readLine())!=null){
sb.附加(第+行“n”);
}
is.close();
json=sb.toString();
Log.e(“JSON”,JSON);
}捕获(例外e){
Log.e(“缓冲区错误”,“错误转换结果”+e.toString());
}
//尝试将字符串解析为JSON对象
试一试{
jObj=新的JSONObject(json);
}捕获(JSONException e){
Log.e(“JSON解析器”,“错误解析数据”+e.toString());
}
//返回JSON字符串
返回jObj;
}
}
由于无法在主UI线程中执行网络操作,因此请在已执行网络操作的位置使用asynctask
如果我没有记错的话,那么您的
getJSONFromUrl
只执行网络操作。因此,请使用Asynctask调用它,因为您无法在主UI线程中执行网络操作,所以请在执行网络操作的地方使用Asynctask
如果我没有记错的话,您的getJSONFromUrl
只是在做网络操作。所以请使用Asynctask调用它
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();
}
}
}
希望有帮助试试这个
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();
}
}
}
希望这是帮助这正是我一直试图放置异步任务的地方,但我很难正确地将其组合在一起并传递参数检查异步任务文档…………如果仍然存在问题,请使用此选项并发布更新的代码这正是我一直试图放置异步任务的地方,但我很难放置它正确地组合并传递参数检查asynctask文档…………使用此项并发布更新的代码,如果仍然存在问题是的,非常感谢,我必须做一些小更改才能使其工作,但一切都很好是的,非常感谢,我必须做一些小更改才能使其工作,但一切都很好