2011-07-05 114 views
1

確定你所有的超級java/android guru的。我知道你會看到這個笑,但我真的需要幫助。我是一個超級新手,並且已經閱讀了所有Google開發文檔(還有更多),並且無法理解這個概念。可以通過查看工作代碼而不是轉介我已經閱讀並顯然不理解的東西來學習更多,所以如果有人能幫助我,那將是美好的。按下後退按鈕時,定時器不關閉。 Forceclose錯誤按鈕按

主要活動

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; 

} 



} 

目錄下載

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} 

任何和所有幫助將不勝感激。

在這一點上,我覺得自己像一個完全瘋狂的女人,真的需要完成這個項目,所以我的生活可以前進。如果任何人(任何人)對此有回答,我會真正讚賞它。

+0

你好嗎按下按鈕有什麼錯誤? – Estel

+0

對不起力量在onPause關閉,並假設它曾經做過,onResume也會有問題。 – Chris

+0

請添加一個堆棧跟蹤(其實我希望它會在每次定時器被觸發時崩潰) – mibollma

回答

0

您可以在您的活動中嘗試攔截onBackPressed,然後執行timer.cancel()。像

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

想要的mtimer是一個局部變量? – Chris

+0

對不起....我錯過了班級計時器聲明,所以編輯了我的第一個響應... – Torid

+0

當。沒有工作。 :( – Chris

0

的onStop()的東西是更可靠的位置放timer.cancel()(或兩者的地方,如果你想覆蓋幾乎每情況,如在年底here規定的情況下)。

onPause()在所有情況下都不會調用,它在onResume()可能發生時使用,例如當您繼續執行另一個活動並返回時。請注意0​​中的縮進。當後退按鈕被按下時,它可能不會被調用。編輯1:這是一個編輯前的答案,所以可能不包括強制關閉問題。

編輯2:

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

始終把調用超先在這些生命週期方法。我不確定它是否有所作爲。你可能也想設置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()); 
    } 
} 
+0

這段代碼是什麼樣的?我嘗試過沒有成功,但可能做錯了。 – Chris

+0

darn。也沒有工作。 – Chris

+0

'沒有工作'意味着計時器仍在運行或它強制關閉? – atheaos

1

你有一個私人定時器稱爲定時活動中,但是這似乎並沒有被初始化,因爲你叫你的活動範圍內的計時器另一個定時器。您在webview下定義的私人計時器計時器爲空,因此您在調用onPause時會得到nullpointexception。

從onCreate()中刪除類,您可能需要將Timer定義爲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; 

} 



} 
+0

謝謝!這確實有助於看到上下文中的一切。Eclipse一直想要錯誤的說ing「類型不匹配:無法從ScheduledExecutorService轉換爲Timer」並且需要強制轉換。有什麼建議麼? – Chris

+0

你可以讓計時器只是一個計時器,在開始時做timer = new Timer()。你想要的任何理由是作爲一個newSingleThreadScheduledExecutor? –

+0

沒有理由除了使其工作。沒有運氣。它造成了各地的錯誤。 – Chris