Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 长时间运行后,截击崩溃应用程序已投入使用_Java_Android_Service_Out Of Memory_Android Volley - Fatal编程技术网

Java 长时间运行后,截击崩溃应用程序已投入使用

Java 长时间运行后,截击崩溃应用程序已投入使用,java,android,service,out-of-memory,android-volley,Java,Android,Service,Out Of Memory,Android Volley,我正在实施从服务器获取更新的服务,如下所示: public class Myupdates extends Service { private static final String TAG = "AutoUpdates"; private static final int started = 0; static SQLiteDatabase db; private boolean isRunning = false; private CountDow

我正在实施从服务器获取更新的服务,如下所示:

public class Myupdates extends Service {

    private static final String TAG = "AutoUpdates";
    private static final int started = 0;
    static SQLiteDatabase db;
    private boolean isRunning = false;

    private CountDownTimer timer;

    @Override
    public void onCreate() {
        this.db = openOrCreateDatabase("db", Context.MODE_PRIVATE, null);
        //Log.i(TAG, "Service onCreate");
        isRunning = true;
    }

    int mCount = 1;

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {

        //Log.i(TAG, "Service onStartCommand");

        //Creating new thread for my service
        //Always write your long running tasks in a separate thread, to avoid ANR
        new Thread(new Runnable() {
            @Override
            public void run() {

                if (isRunning) {

                    new Timer().scheduleAtFixedRate(new TimerTask() {
                        @Override
                        public void run() {
                            updates();
                        }
                    }, 0, 30000);

                }
                //Stop service once it finishes its task
                //stopSelf();
            }
        }).start();

        return Service.START_STICKY;
    }

    @Override
    public IBinder onBind(Intent arg0) {
        //Log.i(TAG, "Service onBind");
        return null;
    }

    @Override
    public void onDestroy() {

        isRunning = false;

        //Log.i(TAG, "Service onDestroy");
    }

    /*
        HANDLE ADVERTS
    */
    protected void updates() {
        /*
            JSON
         */
        final JSONObject json = new JSONObject();
        final JSONObject manJson = new JSONObject();
        try {
            manJson.put("userid", "4444");
            manJson.put("version", "6.0");
            final String j = json.put("UPDATE", manJson).toString();
            final String base_url = "https://myweburl.com";
            // Instantiate the RequestQueue.
            RequestQueue queue = Volley.newRequestQueue(this);
            // Request a string response from the provided URL.
            StringRequest stringRequest = new StringRequest(Request.Method.POST, base_url, new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    //Log.i(TAG, "received "+response);
                    try {
                        JSONObject object = (JSONObject) new JSONTokener(response).nextValue();
                        String update = object.getString("UPDATE");
                    } catch (JSONException e) {
                        return;
                    }
                    return;
                }
            }, new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    //perform operation here after getting error
                    return;
                }
            }) {
                @Override
                protected Map<String, String> getParams() {
                    Map<String, String> params = new HashMap<String, String>();
                    //pack message into json
                    try {
                        params.put("data", j.toString());
                    } catch (Exception e) {
                        //Log.i(TAG,"Map error: Unable to compile post");
                    }
                    return params;
                }

                @Override
                public Map<String, String> getHeaders() throws AuthFailureError {
                    Map<String, String> params = new HashMap<String, String>();
                    params.put("Content-Type", "application/x-www-form-urlencoded");
                    return params;
                }
            };
            // Add the request to the RequestQueue.
            queue.add(stringRequest);
            // ends here
            return;
        } catch (Exception e) {
            //Log.i(TAG,"ERROR: Unable to get setup settings");
        } // end exception write
        return;
    }

}
公共类MyUpdate扩展服务{
私有静态最终字符串标记=“自动更新”;
私有静态final int start=0;
静态数据库数据库;
私有布尔值isRunning=false;
私人倒计时;
@凌驾
public void onCreate(){
this.db=openOrCreateDatabase(“db”,Context.MODE_PRIVATE,null);
//Log.i(标记“serviceoncreate”);
isRunning=true;
}
int mCount=1;
@凌驾
公共int onStartCommand(Intent Intent、int标志、int startId){
//Log.i(标签,“服务启动命令”);
//为我的服务创建新线程
//始终在单独的线程中编写长时间运行的任务,以避免出现错误
新线程(newrunnable()){
@凌驾
公开募捐{
如果(正在运行){
新计时器().scheduleAtFixedRate(新计时器任务()){
@凌驾
公开募捐{
更新();
}
}, 0, 30000);
}
//完成任务后停止服务
//stopSelf();
}
}).start();
return Service.START\u STICKY;
}
@凌驾
公共IBinder onBind(意图arg0){
//Log.i(标签“服务绑定”);
返回null;
}
@凌驾
公共空间{
isRunning=false;
//Log.i(标签“服务存储”);
}
/*
处理广告
*/
受保护的无效更新(){
/*
JSON
*/
final JSONObject json=new JSONObject();
final JSONObject manJson=new JSONObject();
试一试{
manJson.put(“userid”,“4444”);
manJson.put(“版本”,“6.0”);
最后一个字符串j=json.put(“UPDATE”,manJson).toString();
最终字符串base_url=”https://myweburl.com";
//实例化RequestQueue。
RequestQueue=Volley.newRequestQueue(this);
//从提供的URL请求字符串响应。
StringRequest StringRequest=新建StringRequest(Request.Method.POST,base_url,new Response.Listener()){
@凌驾
公共void onResponse(字符串响应){
//Log.i(标签,“接收”+响应);
试一试{
JSONObject object=(JSONObject)新的JSONTokener(response).nextValue();
字符串更新=object.getString(“更新”);
}捕获(JSONException e){
返回;
}
返回;
}
},new Response.ErrorListener(){
@凌驾
公共无效onErrorResponse(截击错误){
//获取错误后在此处执行操作
返回;
}
}) {
@凌驾
受保护的映射getParams(){
Map params=新的HashMap();
//将消息打包为json
试一试{
参数put(“数据”,j.toString());
}捕获(例外e){
//Log.i(标记“映射错误:无法编译post”);
}
返回参数;
}
@凌驾
公共映射getHeaders()引发AuthFailureError{
Map params=新的HashMap();
参数put(“内容类型”、“应用程序/x-www-form-urlencoded”);
返回参数;
}
};
//将请求添加到RequestQueue。
添加(stringRequest);
//到此为止
返回;
}捕获(例外e){
//Log.i(标记“错误:无法获取设置设置”);
}//结束异常写入
返回;
}
}
但是,服务长时间运行后,应用程序崩溃,出现以下错误:

03-08 00:19:41.570 11239-11253/com.mobiledatabook.com.dialcode E/AndroidRuntime:致命异常:计时器-0 进程:com.mobiledatabook.com.dialcode,PID:11239 java.lang.OutOfMemoryError:pthread_create(堆栈大小16384字节) 失败:请重试 创建(本机方法) 在java.lang.Thread.start(Thread.java:1029)处 位于com.android.volley.RequestQueue.start(RequestQueue.java:152) 位于com.android.volley.toolbox.volley.newRequestQueue(volley.java:66) 位于com.android.volley.toolbox.volley.newRequestQueue(volley.java:78) 在 com.mobiledatabook.com.dialcode.Myupdates.iDialAutoUpdates(Myupdates.java:128) 在 com.mobiledatabook.com.dialcode.Myupdates$1$1.run(Myupdates.java:74) 在java.util.Timer$TimerImpl.run(Timer.java:284)

错误:java.lang.OutOfMemoryError

有人能帮我改进这段代码以避免a崩溃吗
public class AppController extends Application {
    private static AppController sInstance;
    private RequestQueue mRequestQueue;

    @Override
    public void onCreate() {
    super.onCreate();

    sInstance = this;
    }

    public static synchronized AppController getInstance() {
    return sInstance;
    }

    public RequestQueue getRequestQueue() {

            if (mRequestQueue == null) {
                mRequestQueue = Volley.newRequestQueue(getApplicationContext());
            }

            return mRequestQueue;
        }

}
RequestQueue queue=AppController.getInstance().getRequestQueue();