Android-приложение автоматически закрывается

Я написал приложение для Android, которое периодически отправляет данные GPS на веб-сервер. Я использовал расположение менеджера и httpget классов Android.

Работает нормально. Но проблема в том, что приложение таинственно закрывается без какого-либо сообщения об ошибке, не вызывая метод закрытия активности. Я даже всегда включаю экран активности, чтобы экран никогда не выключался после истечения времени ожидания. Также я добавил некоторые функциональные возможности вибрации в методы onClose или onDestroy, переопределив их, чтобы при закрытии приложения я мог записывать журнал ошибок в файл.

Но все равно ничего не произошло. Эти методы вообще не вызываются, и приложение загадочно закрывается.

Приложение работает отлично в течение некоторого времени. Я проверяю это, включив GPS и 3G, и некоторое время хожу по улице. Но когда я добрался до дома, я обнаружил, что приложение уже закрыто.

Пожалуйста, помогите ему, если мне не хватает какой-то обработки или это переполнение памяти?

Вот мой исходный код

MainActivity.java

package com.test.partha1.gps1;

import android.app.*;
import android.content.*;
import android.location.*;
import android.os.*;
import android.view.*;
import android.widget.*;

import android.net.ConnectivityManager;
import android.net.NetworkInfo;

import org.apache.http.HttpResponse;
import org.apache.http.client.*;
import org.apache.http.client.methods.*;
import org.apache.http.impl.client.DefaultHttpClient;

import java.io.*;
import java.net.*;
import java.util.*;

public class MainActivity extends Activity implements LocationListener {
Button urlBtn;
ToggleButton toggleBtn;
TextView txt1;
TextView urlServer;

long prevTime = -1;
double prevLatitude;
double prevLongitude;

boolean isGPSEnabled = false;
int count = 0;
protected LocationManager locationManager;
RandomAccessFile outFile;

String TimeStamp = "";

String UserID = "4084";

String server = "http://www.parthasarathimishra.com";

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

File externalStorageDir = Environment.getExternalStorageDirectory();
File myFile = new File(externalStorageDir, "ErrLogFile.txt");

txt1 = (TextView) findViewById(R.id.gpsVal);
urlServer = (TextView) findViewById(R.id.urlTxt);
urlBtn = (Button) findViewById(R.id.urlBtn);
urlBtn.setOnClickListener(urlBtnClick);
toggleBtn = (ToggleButton) findViewById(R.id.toggleButton);

try
{
    if(!myFile.exists())
    {
        myFile.createNewFile();
    }

    outFile = new RandomAccessFile(myFile, "rw");
    outFile.seek(myFile.length());
}
catch(Exception e)
{
    txt1.setText(e.getMessage());
}

locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
}

@Override
public void onStop () {

try
{
    outFile.close();
}
catch(Exception e)
{
}

super.onStop();
}

@Override
protected void onDestroy()
{
Vibrator v = (Vibrator)this.getSystemService(Context.VIBRATOR_SERVICE);
v.vibrate(2000);

super.onDestroy();
 }


@Override
public void onLocationChanged(Location location) {

if(!urlBtn.isEnabled() && ((prevTime == -1) || (System.currentTimeMillis() - prevTime >= 10000)))
 {
    try
    {
        UpdateTimeStamp();
        connectWithHttpGet(String.valueOf(location.getLatitude()), String.valueOf(location.getLongitude()), TimeStamp);

        prevTime = System.currentTimeMillis();
        prevLatitude = location.getLatitude();
        prevLongitude = location.getLongitude();

        txt1.setText(String.valueOf(prevLatitude) + "/" + String.valueOf(prevLongitude));
    }
    catch(Exception e)
    {
        txt1.setText(e.getMessage());

        try
        {
            outFile.writeBytes("\r\n" + e.getMessage());
        }
        catch (Exception e2)
        {
            txt1.setText(e2.getMessage());
        }
    }
}
else
{
    txt1.setText("");
}
}

@Override
public void onStatusChanged(String provider, int status, Bundle extras) {

}

@Override
public void onProviderEnabled(String provider) {

txt1.setText("GPS ON");
isGPSEnabled = true;
}

@Override
public void onProviderDisabled(String provider) {

txt1.setText("GPS OFF");
isGPSEnabled = false;
}

private boolean isNetworkAvailable()
{
ConnectivityManager connectivityManager
        = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
return activeNetworkInfo != null && activeNetworkInfo.isConnected();
}

private void UpdateTimeStamp()
{
Date date = new Date();
date.setTime(System.currentTimeMillis());
String cTime = date.toString();

Calendar cal = Calendar.getInstance();
String day   = cTime.split(" ")[2];
String month = String.valueOf(cal.MONTH);
String year  = cTime.split(" ")[cTime.split(" ").length - 1];

String hr  = cTime.split(" ")[3].split(":")[0];
String min = cTime.split(" ")[3].split(":")[1];
String sec = cTime.split(" ")[3].split(":")[2];

TimeStamp = day + "," + month + "," + year + "," + hr + "," + min + "," + sec;
}

private View.OnClickListener urlBtnClick = new View.OnClickListener() {
   @Override
   public void onClick(View v) {
   server = urlServer.toString();
}
};

  public void toggleBtnChange(View view)
{
boolean on = ((ToggleButton)view).isChecked();

if(on)
{
    if(isNetworkAvailable())
    {
        urlBtn.setEnabled(false);
        urlServer.setEnabled(false);
            locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);
    }
    else
    {
        txt1.setText("No Network!! Enable the Network Connectivity.");
    }
}
else
{
    urlBtn.setEnabled(true);
    urlServer.setEnabled(true);
    locationManager.removeUpdates(this);
}

}
private void connectWithHttpGet(final String pLatitude, final String pLongitude, final String timeStamp) {

class HttpGetAsyncTask extends AsyncTask<String, Void, String>{
    String url = "";
    String Lat = pLatitude;
    String Lng = pLongitude;
    String tStamp = timeStamp;

    @Override
    protected String doInBackground(String... params) {
        url = server + "/" + UserID + "/add.php?lat=" +
                Lat + "&long=" + Lng + "&time=" + tStamp;
        try
        {
            HttpClient httpClient = new DefaultHttpClient();
            HttpGet httpGet = new HttpGet(url);
            HttpResponse httpResponse = httpClient.execute(httpGet);
            int status = httpResponse.getStatusLine().getStatusCode();

            if(status != 200)
            {
                txt1.setText("Unable to Send");
            }
        }
        catch(Exception e)
        {
            txt1.setText(e.getMessage());

            try
            {
                outFile.writeBytes("\r\n" + e.getMessage());
            }
            catch (Exception e2)
            {
                txt1.setText(e2.getMessage());
            }
        }
        return "";
    }

    @Override
    protected void onPostExecute(String result) {
        super.onPostExecute(result);
    }
}
// Initialize the AsyncTask class
HttpGetAsyncTask httpGetAsyncTask = new HttpGetAsyncTask();
// Parameter we pass in the execute() method is relate to the first generic type of the AsyncTask
// We are passing the connectWithHttpGet() method arguments to that
httpGetAsyncTask.execute(pLatitude, pLongitude);
}

@Override
protected void onResume(){
super.onResume();
}
}

activity_main.xml

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:paddingLeft="@dimen/activity_horizontal_margin"
  android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context=".MainActivity"
android:background="#ff3f3dad"
android:id="@+id/lay"
android:keepScreenOn="true">

<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Update URL"
android:id="@+id/urlBtn"
android:textColor="#ff000000"
android:layout_centerVertical="true"
android:layout_centerHorizontal="true" />

<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/gpsVal"
android:textColor="#ffffffff"
android:textSize="10dp"
android:background="#ff000000"
android:layout_alignParentBottom="true"
android:layout_marginBottom="50dp"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true" />

<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/urlTxt"
android:text="www.parthasarathimishra.com"
android:textColor="#fffff500"
android:editable="true"
android:background="#ff000000"
android:layout_below="@+id/urlBtn"
android:layout_alignParentLeft="true"
android:layout_marginTop="41dp"
android:layout_alignParentRight="true" />

<ToggleButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="ON"
android:id="@+id/toggleButton"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="45dp"
android:onClick="toggleBtnChange" />

 </RelativeLayout>

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.test.partha1.gps1" >

 <application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
    android:name=".MainActivity"
    android:label="@string/app_name" >
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />

        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

</application>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.VIBRATE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
</manifest>

Я использую Android Studio для них. Я использую целевую версию 2.3.3 (API 10), так как в моем телефоне нет версии Android выше.

Пожалуйста, дайте мне знать, если что-то пропустил. Это таинственным сбой без какого-либо уведомления после нескольких отправок HttpGet.

1 ответ

Я не думаю, что это имеет какое-либо отношение к конкретной среде разработки и ее относительному кодированию. Я думаю, что это чисто проблема Android. Я разработал 2 тестовых приложения, одно с сенсором контроля местоположения и одно с использованием Android API. Оба собирают информацию GPS и оба сбой после нескольких чтений. Вы никогда не видели эту проблему в iOS (однако, где iOS преуспевает в некоторых областях, она терпит неудачу в других областях).

По моему мнению, и Android, и iOS все еще являются младенцами и испытывают серьезные проблемы со взрослением, и это затрудняет доверие при кодировании любых экзотических функций в приложения.

Другие вопросы по тегам