#android #exception #mobile
#Android #исключение #Мобильный
Вопрос:
Я пытался найти решение в Интернете, к сожалению, я не смог найти ответ. Я попытался использовать try catch, чтобы поймать исключение ошибки, но все равно это не сработает. Вот мой код. У меня есть частный класс LoginTask
private class LoginTask extends AsyncTask<String,String,JSONObject> {
private String[] privateCredentials;
private String privateRequest;
private String errorMessage = "";
//initialize all here
//constructor
LoginTask(String[] credentials,String request) {
this.privateRequest = request;
this.privateCredentials = credentials;
}
@Override
protected void onPostExecute(JSONObject result) {
super.onPostExecute(result);
if(this.privateRequest=="login"){
try {
String response = result.getString("status");
if(response.equals("ok")){
onLoginSuccess(result.getString("username"),result.getString("full_name"),result.getInt("user_id"));
}else{
onLoginFails();
}
} catch (JSONException e) {
if(errorMessage!=""){
Toast ts;
ts = Toast.makeText(LoginActivity.this,errorMessage,Toast.LENGTH_LONG);
ts.show();
}
//e.printStackTrace();
}
}
}
@Override
protected JSONObject doInBackground(String... params) {
String result = "";
JSONObject resultObj = null;
HttpURLConnection con = null;
BufferedReader br = null;
JSONObject cred = new JSONObject();
if(this.privateRequest=="login"){
try {
cred.put("username", this.privateCredentials[0]);
cred.put("password", this.privateCredentials[1]);
URL url = new URL(params[0]);
con = (HttpURLConnection) url.openConnection();
;
con.setDoOutput(true);
con.setDoInput(true);
con.setRequestProperty("Content-Type", "application/json");
con.setRequestProperty("Accept", "application/json");
con.setRequestMethod("POST");
con.connect();
OutputStream outputStream = con.getOutputStream();
outputStream.write(cred.toString().getBytes());
InputStream stream = con.getInputStream();
br = new BufferedReader(new InputStreamReader(stream));
StringBuffer buffer = new StringBuffer();
String line = "";
while ((line = br.readLine()) != null) {
buffer.append(line);
}
//get the result
JSONObject jsonObj = new JSONObject(buffer.toString());
resultObj = jsonObj;
// return buffer.toString();
}catch (JSONException e) {
errorMessage = e.getMessage();
final String error = e.getMessage();
//e.printStackTrace();
runOnUiThread(new Runnable(){
public void run() {
//ErrorDialog(e.getMessage());
Toast ts;
ts = Toast.makeText(LoginActivity.this,error,Toast.LENGTH_LONG);
ts.show();
}
});
} catch (ProtocolException e) {
errorMessage = e.getMessage();
final String error = e.getMessage();
//e.printStackTrace();
runOnUiThread(new Runnable(){
public void run() {
//ErrorDialog(e.getMessage());
Toast ts;
ts = Toast.makeText(LoginActivity.this,error,Toast.LENGTH_LONG);
ts.show();
}
});
//e.printStackTrace();
} catch (IOException e) {
errorMessage = e.getMessage();
final String error = e.getMessage();
//e.printStackTrace();
runOnUiThread(new Runnable(){
public void run() {
//ErrorDialog(e.getMessage());
Toast ts;
ts = Toast.makeText(LoginActivity.this,error,Toast.LENGTH_LONG);
ts.show();
}
});
//e.printStackTrace();
} finally {
if(con!=null) {
con.disconnect();
}
}
return resultObj;
}
return null;
}
}
И вот мой код прослушивателя событий в операции входа в систему.
//when clicking the login button
loginBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//do now the login process
userText.setVisibility(view.INVISIBLE);
passwordText.setVisibility(view.INVISIBLE);
tvRegister.setVisibility(view.INVISIBLE);
umlogo.setVisibility(view.INVISIBLE);
//set textviews to invisible
/* tv[0].setVisibility(view.INVISIBLE);
tv[1].setVisibility(view.INVISIBLE);*/
//set also the button to invisible
loginBtn.setVisibility(view.INVISIBLE);
//set visible the progress bar
pb.setVisibility(view.VISIBLE);
//set now the user login credentials
credentials[0] = userText.getText().toString();
credentials[1] = passwordText.getText().toString();
loginTask = new LoginTask(credentials,"login");
//loginTask.execute("http://10.0.2.2/sampleRequest.php");
//loginTask.execute("http://10.0.2.2/motorpool_june_2016_laravel/public/mobile/login");
loginTask.execute("http://128.199.105.49/mobile/login");
//SessionHolder.login(credentials, la);
}
});
Однако он по-прежнему не работает. Пожалуйста, помогите. 🙁
Комментарии:
1. И ошибка есть ?!
2. Это принудительно закроет приложение. Я пытаюсь перехватить ошибки, чтобы избежать принудительного закрытия приложения… Я ожидаю увидеть всплывающее сообщение, но я получаю только принудительное закрытие… Пожалуйста, помогите
3. Опять же, какова трассировка стека сбоя?
4. К сожалению, я не использую AVD, а вместо этого автоматически генерирую APK и пробую его с помощью Bluestack…
Ответ №1:
Вы не можете сравнивать String
s с ==
java. Вы должны написать это, как показано ниже:
if(this.privateRequest.equals("login")){
==
тесты на равенство ссылок (являются ли они одним и тем же объектом)
Комментарии:
1. Нет… Это не моя проблема.. Я могу войти в систему, если есть Интернет, так что это не проблема.. Проблема в том, что если интернета нет, это принудительно закроет приложение, и это то, чего я пытаюсь избежать.
2. Добавьте журнал logcat в свой вопрос.
3. К сожалению, я не использую AVD.. Когда я тестирую приложение, я просто создаю APK, а затем устанавливаю его с помощью Bluestack….
4. почему? таким образом, вы не сможете ничего отлаживать. используйте устройство Android и его журнал в logcat. вы не можете устранить свои ошибки без журнала
5. ЭТО потому, что есть проблема с AVD… Хорошо, я попробую еще раз с помощью AVD и logcat, чтобы увидеть исключение ошибки.