Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.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_Timer_Onresume_Onpause - Fatal编程技术网

Java 按下后退按钮时,计时器未关闭。按钮按下时强制关闭错误

Java 按下后退按钮时,计时器未关闭。按钮按下时强制关闭错误,java,android,timer,onresume,onpause,Java,Android,Timer,Onresume,Onpause,好的,你们都是超级java/android大师。我知道你会看着这个笑,但我真的需要帮助。我是一个超级新手,读过谷歌的每一篇开发文档(还有更多),只是不能理解这个概念。通过查看工作代码可以学到更多,而不是参考我已经读过但显然不理解的内容,所以如果有人能帮助我,那就太好了 主要活动 import java.util.Timer; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecuto

好的,你们都是超级java/android大师。我知道你会看着这个笑,但我真的需要帮助。我是一个超级新手,读过谷歌的每一篇开发文档(还有更多),只是不能理解这个概念。通过查看工作代码可以学到更多,而不是参考我已经读过但显然不理解的内容,所以如果有人能帮助我,那就太好了

主要活动

 import java.util.Timer;
 import java.util.concurrent.Executors;
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.TimeUnit;
 import android.app.Activity;
 import android.app.ProgressDialog;
 import android.content.Intent;
 import android.content.SharedPreferences;
 import android.os.Bundle;
 import android.preference.PreferenceManager;
 import android.view.Menu;
 import android.view.MenuInflater;
 import android.view.MenuItem;
 import android.view.View;
 import android.view.View.OnClickListener;
 import android.webkit.WebView;

 public class Quotes extends Activity implements OnClickListener {

 ProgressDialog dialog;
private WebView webview;
private Timer timer;

 @Override
 public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    WebView adsview = (WebView) findViewById(R.id.ads);
    adsview.getSettings().setJavaScriptEnabled(true);
    adsview.loadUrl("http://www.dgdevelco.com/quotes/androidad.html");

    SharedPreferences SP = PreferenceManager.getDefaultSharedPreferences(getBaseContext());

    String q = SP.getString("appViewType","http://www.dgdevelco.com/quotes/quotesandroidtxt.html");
    String c = SP.getString("appRefreshRate","20");

    webview = (WebView) findViewById(R.id.scroll);
    webview.getSettings().setJavaScriptEnabled(true);
    webview.setWebViewClient(new QuotesWebView(this));
    webview.loadUrl(q);



    ScheduledExecutorService timer = Executors.newSingleThreadScheduledExecutor();
    timer.scheduleAtFixedRate(new Runnable() {

        @Override
        public void run() {
            webview.reload();

            }

        }, 10, Long.parseLong(c),TimeUnit.SECONDS);




    findViewById(R.id.refresh).setOnClickListener(this);


 }

 @Override
 public void onPause(){
   timer.cancel(); 
   super.onPause();
 }

 @Override
 public void onResume(){
  webview.reload();
      super.onResume();
 }


 public void onClick(View v){
    switch(v.getId()){
    case R.id.refresh:
         webview.reload();
         break;
         }
    }

 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.menu, menu);

    MenuItem about = menu.getItem(0);
    about.setIntent(new Intent(this, About.class));

    MenuItem preferences = menu.getItem(1);
    preferences.setIntent(new Intent(this, Preferences.class));

    return true;

 }



 }   
CatLog

 07-05 17:28:51.001: DEBUG/AndroidRuntime(11446): Shutting down VM
 07-05 17:28:51.001: WARN/dalvikvm(11446): threadid=1: thread exiting with uncaught exception (group=0x40018560)
 07-05 17:28:51.017: ERROR/AndroidRuntime(11446): FATAL EXCEPTION: main
 07-05 17:28:51.017: ERROR/AndroidRuntime(11446): java.lang.RuntimeException: Unable to pause activity {com.dge.quotes/com.dge.quotes.Quotes}: java.lang.NullPointerException
 07-05 17:28:51.017: ERROR/AndroidRuntime(11446):     at android.app.ActivityThread.performPauseActivity(ActivityThread.java:2477)
 07-05 17:28:51.017: ERROR/AndroidRuntime(11446):     at android.app.ActivityThread.performPauseActivity(ActivityThread.java:2424)
 07-05 17:28:51.017: ERROR/AndroidRuntime(11446):     at android.app.ActivityThread.handlePauseActivity(ActivityThread.java:2404)
 07-05 17:28:51.017: ERROR/AndroidRuntime(11446):     at android.app.ActivityThread.access$1700(ActivityThread.java:124)
 07-05 17:28:51.017: ERROR/AndroidRuntime(11446):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:979)
 07-05 17:28:51.017: ERROR/AndroidRuntime(11446):     at android.os.Handler.dispatchMessage(Handler.java:99)
 07-05 17:28:51.017: ERROR/AndroidRuntime(11446):     at android.os.Looper.loop(Looper.java:123)
 07-05 17:28:51.017: ERROR/AndroidRuntime(11446):     at android.app.ActivityThread.main(ActivityThread.java:3806)
 07-05 17:28:51.017: ERROR/AndroidRuntime(11446):     at java.lang.reflect.Method.invokeNative(Native Method)
 07-05 17:28:51.017: ERROR/AndroidRuntime(11446):     at java.lang.reflect.Method.invoke(Method.java:507)
 07-05 17:28:51.017: ERROR/AndroidRuntime(11446):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
 07-05 17:28:51.017: ERROR/AndroidRuntime(11446):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
 07-05 17:28:51.017: ERROR/AndroidRuntime(11446):     at dalvik.system.NativeStart.main(Native Method)
 07-05 17:28:51.017: ERROR/AndroidRuntime(11446): Caused by: java.lang.NullPointerException
 07-05 17:28:51.017: ERROR/AndroidRuntime(11446):     at com.dge.quotes.Quotes.onPause(Quotes.java:72)
 07-05 17:28:51.017: ERROR/AndroidRuntime(11446):     at android.app.Activity.performPause(Activity.java:3901)
 07-05 17:28:51.017: ERROR/AndroidRuntime(11446):     at android.app.Instrumentation.callActivityOnPause(Instrumentation.java:1191)
 07-05 17:28:51.017: ERROR/AndroidRuntime(11446):     at android.app.ActivityThread.performPauseActivity(ActivityThread.java:2459)
 07-05 17:28:51.017: ERROR/AndroidRuntime(11446):     ... 12 more
 07-05 17:28:51.509: WARN/ActivityManager(1319): Activity pause timeout for HistoryRecord{40ba7e20 com.dge.quotes/.Quotes}
我们将非常感谢您的任何帮助


在这一点上,我感觉自己像一个完全疯狂的女人,她真的需要完成这个项目,这样我的生活才能向前发展。如果有人对此有答案,我将不胜感激。

您可以尝试在活动中拦截onBackPressed,然后执行计时器。取消()。差不多

@Override
public void onBackPressed() {
    timer.cancel();
}

您可以尝试在活动中拦截onBackPressed,然后执行计时器。取消()。差不多

@Override
public void onBackPressed() {
    timer.cancel();
}
onStop()是放置timer.cancel()的更可靠的位置(如果您想涵盖几乎所有情况,如结尾所述的情况,可以同时放置这两个位置)

onPause()并不是在所有情况下都被调用,它是在onResume()很可能发生时使用的,例如当您继续执行另一个活动然后返回时。注意图中的缩进。当按下后退按钮时,可能不会调用它

编辑1:这是预编辑答案,因此可能不包括强制关闭问题

编辑2:

@Override
public void onStop(){
    super.onStop();
    try {
        timer.cancel();
    } catch (Exception ex) {
        Log.e("MY APP ERROR", ex.getMessage());
    }
}
在这些生命周期方法中,我总是把调用super放在首位。我不确定这是否有区别。您可能还需要设置try/catch语句,特别是如果您选择在onStop()和onPause()中都包含timer.cancel()

编辑3: 准备承认失败。我对ScheduledExecutorService的怪癖不太熟悉,既然你表示愿意重写,下面是我如何在我的应用程序中完成同样的事情的。Handler是一个特定于Android的实现,所以也许这就是为什么我没有遇到与您相同的问题

Handler timer;
Runnable runner;

@Override
onCreate(...) {
    ...

    //EDIT 4: (reading time from preferences)
    SharedPreferences SP = PreferenceManager.getDefaultSharedPreferences(getBaseContext());

    final int c = Integer.parseInt(SP.getString("appRefreshRate","20"));

    ...

    runner = new Runnable() {
        @Override
        public void run() {
            timer.postDelayed(runner, c * 1000);
            webview.reload();
        }
    };
    timer = new Handler();
    timer.postDelayed(runner, c * 1000);

    ...
}

@Override
public void onPause(){
    super.onPause();
    try {
        timer.removeCallbacks(runner);
    } catch (Exception ex) {
        Log.e("MY APP ERROR", ex.getMessage());
    }
}

@Override
public void onStop(){
    super.onStop();
    try {
        timer.removeCallbacks(runner);
    } catch (Exception ex) {
        Log.e("MY APP ERROR", ex.getMessage());
    }
}
onStop()是放置timer.cancel()的更可靠的位置(如果您想涵盖几乎所有情况,如结尾所述的情况,可以同时放置这两个位置)

onPause()并不是在所有情况下都被调用,它是在onResume()很可能发生时使用的,例如当您继续执行另一个活动然后返回时。注意图中的缩进。当按下后退按钮时,可能不会调用它

编辑1:这是预编辑答案,因此可能不包括强制关闭问题

编辑2:

@Override
public void onStop(){
    super.onStop();
    try {
        timer.cancel();
    } catch (Exception ex) {
        Log.e("MY APP ERROR", ex.getMessage());
    }
}
在这些生命周期方法中,我总是把调用super放在首位。我不确定这是否有区别。您可能还需要设置try/catch语句,特别是如果您选择在onStop()和onPause()中都包含timer.cancel()

编辑3: 准备承认失败。我对ScheduledExecutorService的怪癖不太熟悉,既然你表示愿意重写,下面是我如何在我的应用程序中完成同样的事情的。Handler是一个特定于Android的实现,所以也许这就是为什么我没有遇到与您相同的问题

Handler timer;
Runnable runner;

@Override
onCreate(...) {
    ...

    //EDIT 4: (reading time from preferences)
    SharedPreferences SP = PreferenceManager.getDefaultSharedPreferences(getBaseContext());

    final int c = Integer.parseInt(SP.getString("appRefreshRate","20"));

    ...

    runner = new Runnable() {
        @Override
        public void run() {
            timer.postDelayed(runner, c * 1000);
            webview.reload();
        }
    };
    timer = new Handler();
    timer.postDelayed(runner, c * 1000);

    ...
}

@Override
public void onPause(){
    super.onPause();
    try {
        timer.removeCallbacks(runner);
    } catch (Exception ex) {
        Log.e("MY APP ERROR", ex.getMessage());
    }
}

@Override
public void onStop(){
    super.onStop();
    try {
        timer.removeCallbacks(runner);
    } catch (Exception ex) {
        Log.e("MY APP ERROR", ex.getMessage());
    }
}

活动中有一个名为Timer的专用计时器,但由于活动中有另一个名为Timer的计时器,因此该计时器似乎尚未初始化。在webview下定义的专用计时器为null,因此在调用onPause时会得到nullpointexception

如果从onCreate()中删除该类,则可能需要将计时器定义为singlethreadscheduledexecutor

timer = Executors.newSingleThreadScheduledExecutor();
timer.scheduleAtFixedRate(new Runnable() {
您的代码和建议答案:

import java.util.Timer;
 import java.util.concurrent.Executors;
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.TimeUnit;
 import android.app.Activity;
 import android.app.ProgressDialog;
 import android.content.Intent;
 import android.content.SharedPreferences;
 import android.os.Bundle;
 import android.preference.PreferenceManager;
 import android.view.Menu;
 import android.view.MenuInflater;
 import android.view.MenuItem;
 import android.view.View;
 import android.view.View.OnClickListener;
 import android.webkit.WebView;

 public class Quotes extends Activity implements OnClickListener {

 ProgressDialog dialog;
private WebView webview;
private Timer timer;

 @Override
 public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    WebView adsview = (WebView) findViewById(R.id.ads);
    adsview.getSettings().setJavaScriptEnabled(true);
    adsview.loadUrl("http://www.dgdevelco.com/quotes/androidad.html");

    SharedPreferences SP = PreferenceManager.getDefaultSharedPreferences(getBaseContext());

    String q = SP.getString("appViewType","http://www.dgdevelco.com/quotes/quotesandroidtxt.html");
    String c = SP.getString("appRefreshRate","20");

    webview = (WebView) findViewById(R.id.scroll);
    webview.getSettings().setJavaScriptEnabled(true);
    webview.setWebViewClient(new QuotesWebView(this));
    webview.loadUrl(q);



    timer = Executors.newSingleThreadScheduledExecutor();
    timer.scheduleAtFixedRate(new Runnable() {

        @Override
        public void run() {
            webview.reload();

            }

        }, 10, Long.parseLong(c),TimeUnit.SECONDS);




    findViewById(R.id.refresh).setOnClickListener(this);


 }

 @Override
 public void onPause(){
   timer.cancel(); 
   super.onPause();
 }

 @Override
 public void onResume(){
  webview.reload();
      super.onResume();
 }


 public void onClick(View v){
    switch(v.getId()){
    case R.id.refresh:
         webview.reload();
         break;
         }
    }

 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.menu, menu);

    MenuItem about = menu.getItem(0);
    about.setIntent(new Intent(this, About.class));

    MenuItem preferences = menu.getItem(1);
    preferences.setIntent(new Intent(this, Preferences.class));

    return true;

 }



 }   

活动中有一个名为Timer的专用计时器,但由于活动中有另一个名为Timer的计时器,因此该计时器似乎尚未初始化。在webview下定义的专用计时器为null,因此在调用onPause时会得到nullpointexception

如果从onCreate()中删除该类,则可能需要将计时器定义为singlethreadscheduledexecutor

timer = Executors.newSingleThreadScheduledExecutor();
timer.scheduleAtFixedRate(new Runnable() {
您的代码和建议答案:

import java.util.Timer;
 import java.util.concurrent.Executors;
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.TimeUnit;
 import android.app.Activity;
 import android.app.ProgressDialog;
 import android.content.Intent;
 import android.content.SharedPreferences;
 import android.os.Bundle;
 import android.preference.PreferenceManager;
 import android.view.Menu;
 import android.view.MenuInflater;
 import android.view.MenuItem;
 import android.view.View;
 import android.view.View.OnClickListener;
 import android.webkit.WebView;

 public class Quotes extends Activity implements OnClickListener {

 ProgressDialog dialog;
private WebView webview;
private Timer timer;

 @Override
 public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    WebView adsview = (WebView) findViewById(R.id.ads);
    adsview.getSettings().setJavaScriptEnabled(true);
    adsview.loadUrl("http://www.dgdevelco.com/quotes/androidad.html");

    SharedPreferences SP = PreferenceManager.getDefaultSharedPreferences(getBaseContext());

    String q = SP.getString("appViewType","http://www.dgdevelco.com/quotes/quotesandroidtxt.html");
    String c = SP.getString("appRefreshRate","20");

    webview = (WebView) findViewById(R.id.scroll);
    webview.getSettings().setJavaScriptEnabled(true);
    webview.setWebViewClient(new QuotesWebView(this));
    webview.loadUrl(q);



    timer = Executors.newSingleThreadScheduledExecutor();
    timer.scheduleAtFixedRate(new Runnable() {

        @Override
        public void run() {
            webview.reload();

            }

        }, 10, Long.parseLong(c),TimeUnit.SECONDS);




    findViewById(R.id.refresh).setOnClickListener(this);


 }

 @Override
 public void onPause(){
   timer.cancel(); 
   super.onPause();
 }

 @Override
 public void onResume(){
  webview.reload();
      super.onResume();
 }


 public void onClick(View v){
    switch(v.getId()){
    case R.id.refresh:
         webview.reload();
         break;
         }
    }

 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.menu, menu);

    MenuItem about = menu.getItem(0);
    about.setIntent(new Intent(this, About.class));

    MenuItem preferences = menu.getItem(1);
    preferences.setIntent(new Intent(this, Preferences.class));

    return true;

 }



 }   

你按下按钮时出现了什么错误?对不起,在onPause中强制关闭,我假设如果它成功了,onResume也会有问题。请添加stacktrace(实际上,我希望每次定时器启动时它都会崩溃)@mibollma如果你认为它会更好的话,我完全可以重写整个过程。-->你按下按钮时出现了什么错误?很抱歉,在onPause中强制关闭,我假设如果它成功了,onResume也会有问题。请添加stacktrace(实际上,我希望每次定时器启动时它都会崩溃)@mibollma如果你认为它会更好的话,我完全可以重写整个代码。-->那代码会是什么样子?我试过了,但没有成功,但可能是做错了。“不工作”是指计时器仍在运行还是强制关闭?07-05 17:51:51.580:ERROR/AndroidRuntime(11844):java.lang.RuntimeException:无法停止活动{com.dge.quotes/com.dge.quotes.quotes}:java.lang.NullPointerException可能有效,但如何调用字符串c(来自首选项的用户输入)进入计时器?编辑以演示用户偏好输入,但@david olsson看到了我在阅读您的代码时错过的上千次。该代码是什么样子的?我尝试过,但没有成功,但可能是做错了。“不工作”是指计时器仍在运行还是强制关闭?07-05 17:51:51.580:ERROR/AndroidRuntime(11844):java.lang.RuntimeException:无法停止活动{com.dge.quotes/com.dge.quotes.quotes}:java.lang.nullpointerException可能会工作,但我如何将字符串c(来自首选项的用户输入)调用到计时器中?编辑以演示用户首选项输入,但@david olsson看到了w