2013-11-21 126 views
0

我希望應用程序的線程停止在onclick和ondestroy,意味着我希望線程停止時,單擊一個按鈕,當我退出應用程序,現在線程不會停止,即使我退出它...我應該在哪裏放我的而(!關機)?對不起進出口新的這個..你的幫助是非常讚賞如何通過使用布爾值來停止線程?

package com.example.suntracking; 

import java.util.Calendar; 

import android.app.Activity; 
import android.content.Intent; 
import android.content.SharedPreferences; 
import android.content.SharedPreferences.Editor; 
import android.os.Bundle; 
import android.os.Handler; 
import android.view.KeyEvent; 
import android.view.Menu; 
import android.view.View; 
import android.widget.Button; 
import android.widget.TextView; 

public class MainActivity extends Activity implements View.OnClickListener{ 
    //showing input and output 
    TextView aziangle,elevation,numberof,rightasc,decli,hourangle,solartime,showinlat,showinlong, 
    showintimezone,showindlst,showinofftime,showinoffazi,showinoffele,showinoffphi,showinofflamda,showinoffxi, 
    showdate,showtime,showday; 

    Button editting; 
    Float latval,longval,offtimeval,offazival,offeleval,offphival,offlamdaval,offxival; 
    int timeval,taketimesec,taketimeminute,taketimehour,takedateday,takedatemonth,takedateyear; 
    String show1,show2,show3,show4,sshowday,takeampmtext; 
    //for clock 
    int timesec,timeminute,timehour,dateday,datemonth,dateyear,day,ampm; 
    String daytext,ampmtext,showazi,showele,shownoday,showra,showdecli,showh_angle,shows_time; 
    Handler mHandler = new Handler(); 
    Thread r; 
    volatile boolean shutdown = false; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     initialize(); 
     loadSavedpreferences(); 
     r = new Thread(new Runnable(){ 
      @Override 
      public void run() { 
       // TODO Auto-generated method stub 
       while (true) { 
        try { 
         Thread.sleep(1000); 
         mHandler.post(new Runnable() { 

          @Override 
          public void run() { 
           // TODO Auto-generated method stub 
           // Write your code here to update the UI. 
           Save_fetchPref(); 
           run_cal(); 

          } 

          private void run_cal() { 
           // TODO Auto-generated method stub 
           Intent j=new Intent(MainActivity.this,Calculation.class); 
           startActivity(j); 
          } 

          private void Save_fetchPref() { 
           // TODO Auto-generated method stub 
            Calendar c = Calendar.getInstance(); 
              timesec = c.get(Calendar.SECOND); 
              timeminute = c.get(Calendar.MINUTE); 
              timehour = c.get(Calendar.HOUR_OF_DAY); 
              ampm = c.get(Calendar.AM_PM); 
              if(ampm==0){ 
               ampmtext="AM"; 
              }else { 
               ampmtext="PM"; 
              } 
              dateday = c.get(Calendar.DAY_OF_MONTH); 
              datemonth = c.get(Calendar.MONTH); 
              datemonth += 1; 
              dateyear = c.get(Calendar.YEAR); 
              day = c.get(Calendar.DAY_OF_WEEK); 
              switch(day){ 
              case 1: 
               daytext="SUNDAY"; 
               break; 
              case 2: 
               daytext="MONDAY"; 
               break; 
              case 3: 
               daytext="TUESDAY"; 
               break; 
              case 4: 
               daytext="WEDNESDAY"; 
               break; 
              case 5: 
               daytext="THURSDAY"; 
               break; 
              case 6: 
               daytext="FRIDAY"; 
               break; 
              case 7: 
               daytext="SATURDAY"; 
               break; 
              } 
              savePreferences(); 
              loadSavedpreferences(); 
          } 
         }); 
        } catch (Exception e) { 
         // TODO: handle exception 
        } 
       } 
       } 
     }); 
     r.start(); 
    } 




    private void savePreferences() { 
     // TODO Auto-generated method stub 
     SharedPreferences savedata = getSharedPreferences("savealldata",0); 
     Editor editor=savedata.edit(); 
     editor.putInt("timesec",timesec); 
     editor.putInt("timeminute", timeminute); 
     editor.putInt("timehour", timehour); 
     editor.putInt("dateday", dateday); 
     editor.putInt("datemonth", datemonth); 
     editor.putInt("dateyear", dateyear); 
     editor.putInt("ampm", ampm); 
     editor.putString("daytext", daytext); 
     editor.putString("ampmtext", ampmtext); 
     editor.commit(); 
    } 


    private void initialize() { 
     // TODO Auto-generated method stub 
     aziangle=(TextView)findViewById(R.id.tvAziAngle); 
     elevation=(TextView)findViewById(R.id.tvElevation); 
     numberof=(TextView)findViewById(R.id.tvNumberof); 
     rightasc=(TextView)findViewById(R.id.tvRightAsc); 
     decli=(TextView)findViewById(R.id.tvDecli); 
     hourangle=(TextView)findViewById(R.id.tvHourAngle); 
     solartime=(TextView)findViewById(R.id.tvSolarTime); 
     showday=(TextView)findViewById(R.id.tvDay); 
     showdate=(TextView)findViewById(R.id.tvDate); 
     showtime=(TextView)findViewById(R.id.tvTime); 
     showinlat=(TextView)findViewById(R.id.tvShowInLat); 
     showinlong=(TextView)findViewById(R.id.tvShowInLong); 
     showintimezone=(TextView)findViewById(R.id.tvShowInTimeZone); 
     showindlst=(TextView)findViewById(R.id.tvShowInDLST); 
     showinofftime=(TextView)findViewById(R.id.tvShowInOffTime); 
     showinoffazi=(TextView)findViewById(R.id.tvShowInOffAzimuth); 
     showinoffele=(TextView)findViewById(R.id.tvShowInOffElevation); 
     showinoffphi=(TextView)findViewById(R.id.tvShowInOffphi); 
     showinofflamda=(TextView)findViewById(R.id.tvShowInOfflamda); 
     showinoffxi=(TextView)findViewById(R.id.tvShowInOffxi); 
     editting=(Button)findViewById(R.id.bedit); 
     editting.setOnClickListener(this); 
     } 


    private void loadSavedpreferences() { 
     // TODO Auto-generated method stub 
     SharedPreferences savedata= getSharedPreferences("savealldata",0); 
     //input 
     sshowday=savedata.getString("daytext",null); 
     showday.setText(sshowday); 

     takedateday=savedata.getInt("dateday",00); 
     takedatemonth=savedata.getInt("datemonth", 00); 
     takedateyear=savedata.getInt("dateyear", 00); 
     showdate.setText(takedateday + "/" + takedatemonth + "/" + takedateyear); 

     taketimesec=savedata.getInt("timesec", 00); 
     taketimeminute=savedata.getInt("timeminute", 00); 
     taketimehour=savedata.getInt("timehour", 00); 
     takeampmtext=savedata.getString("ampmtext", "AM"); 
     showtime.setText(taketimehour + ":" + taketimeminute + ":" + taketimesec + takeampmtext); 

     show1=savedata.getString("show1",null); 
     latval=savedata.getFloat("latval", 0); 
     showinlat.setText("Latitude : " + latval + ", " + show1); 

     show2=savedata.getString("show2",null); 
     longval=savedata.getFloat("longval",0); 
     showinlong.setText("Longitude : " + longval + ", " + show2); 

     show3=savedata.getString("show3",null); 
     timeval=savedata.getInt("timezoneval",0); 
     showintimezone.setText("Time Zone : " + timeval + show3); 

     show4=savedata.getString("show4","No"); 
     showindlst.setText("Daylight Saving Time : "+ show4); 

     offtimeval=savedata.getFloat("show5",0); 
     showinofftime.setText("Offset Time : " + offtimeval); 

     offazival=savedata.getFloat("show6",0); 
     showinoffazi.setText("Offset Azimuth : "+ offazival); 

     offeleval=savedata.getFloat("show7",0); 
     showinoffele.setText("Offset Elevation : " + offeleval); 

     offphival=savedata.getFloat("show8", 0); 
     showinoffphi.setText("Offset Φ :" + offphival); 

     offlamdaval=savedata.getFloat("show9", 0); 
     showinofflamda.setText("Offset λ : "+offlamdaval); 

     offxival=savedata.getFloat("show10", 0); 
     showinoffxi.setText("Offset ξ : "+ offxival); 
     //output 
     showazi=savedata.getString("azimuth", null); 
     aziangle.setText("Azimuth Angle : " + showazi); 

     showele=savedata.getString("elevation", null); 
     elevation.setText("Elevation Angle" + showele); 

     shownoday=savedata.getString("jd", null); 
     numberof.setText("Number of Days : " + shownoday); 

     showra=savedata.getString("RA", null); 
     rightasc.setText("Right Ascension : " + showra); 

     showdecli=savedata.getString("declination", null); 
     decli.setText("Declination Angle : " + showdecli); 

     showh_angle=savedata.getString("h_angle", null); 
     hourangle.setText("Hour Angle : " + showh_angle); 

     shows_time=savedata.getString("s_time", null); 
     solartime.setText("Solar Time : " + shows_time); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 

    @Override 
    public void onClick(View v) { 
     // TODO Auto-generated method stub 
     shutdown = true; 
     Intent e=new Intent(MainActivity.this, Parameterlist.class); 
     startActivity(e); 
    } 
    @Override 
    protected void onDestroy() { 
     // TODO Auto-generated method stub 
     super.onDestroy(); 
     shutdown = true ; 
    } 


} 

編輯:

package com.example.suntracking; 

import java.util.Calendar; 

import android.app.Activity; 
import android.content.Intent; 
import android.content.SharedPreferences; 
import android.content.SharedPreferences.Editor; 
import android.os.Bundle; 
import android.os.Handler; 
import android.view.KeyEvent; 
import android.view.Menu; 
import android.view.View; 
import android.widget.Button; 
import android.widget.TextView; 

public class MainActivity extends Activity implements View.OnClickListener{ 
    //showing input and output 
    TextView aziangle,elevation,numberof,rightasc,decli,hourangle,solartime,showinlat,showinlong, 
    showintimezone,showindlst,showinofftime,showinoffazi,showinoffele,showinoffphi,showinofflamda,showinoffxi, 
    showdate,showtime,showday; 

    Button editting; 
    Float latval,longval,offtimeval,offazival,offeleval,offphival,offlamdaval,offxival; 
    int timeval,taketimesec,taketimeminute,taketimehour,takedateday,takedatemonth,takedateyear; 
    String show1,show2,show3,show4,sshowday,takeampmtext; 
    //for clock 
    int timesec,timeminute,timehour,dateday,datemonth,dateyear,day,ampm; 
    String daytext,ampmtext,showazi,showele,shownoday,showra,showdecli,showh_angle,shows_time; 
    Handler mHandler = new Handler(); 
    Thread t; 
    volatile boolean shutdown = false; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     initialize(); 
     loadSavedpreferences(); 
     t = new Thread(new Runnable(){ 
      @Override 
      public void run() { 
       // TODO Auto-generated method stub 
       while (!shutdown) { 
        try { 
         Thread.sleep(1000); 
         mHandler.post(new Runnable() { 

          @Override 
          public void run() { 
           // TODO Auto-generated method stub 
           // Write your code here to update the UI. 
           Save_fetchPref(); 
           run_cal(); 

          } 

          private void run_cal() { 
           // TODO Auto-generated method stub 
           Intent j=new Intent(MainActivity.this,Calculation.class); 
           startActivity(j); 
          } 

          private void Save_fetchPref() { 
           // TODO Auto-generated method stub 
            Calendar c = Calendar.getInstance(); 
              timesec = c.get(Calendar.SECOND); 
              timeminute = c.get(Calendar.MINUTE); 
              timehour = c.get(Calendar.HOUR_OF_DAY); 
              ampm = c.get(Calendar.AM_PM); 
              if(ampm==0){ 
               ampmtext="AM"; 
              }else { 
               ampmtext="PM"; 
              } 
              dateday = c.get(Calendar.DAY_OF_MONTH); 
              datemonth = c.get(Calendar.MONTH); 
              datemonth += 1; 
              dateyear = c.get(Calendar.YEAR); 
              day = c.get(Calendar.DAY_OF_WEEK); 
              switch(day){ 
              case 1: 
               daytext="SUNDAY"; 
               break; 
              case 2: 
               daytext="MONDAY"; 
               break; 
              case 3: 
               daytext="TUESDAY"; 
               break; 
              case 4: 
               daytext="WEDNESDAY"; 
               break; 
              case 5: 
               daytext="THURSDAY"; 
               break; 
              case 6: 
               daytext="FRIDAY"; 
               break; 
              case 7: 
               daytext="SATURDAY"; 
               break; 
              } 
              savePreferences(); 
              loadSavedpreferences(); 
          } 
         }); 
        } catch (Exception e) { 
         // TODO: handle exception 
         e.printStackTrace(); 
        } 
       } 
       } 
     }); 
    } 




    private void savePreferences() { 
     // TODO Auto-generated method stub 
     SharedPreferences savedata = getSharedPreferences("savealldata",0); 
     Editor editor=savedata.edit(); 
     editor.putInt("timesec",timesec); 
     editor.putInt("timeminute", timeminute); 
     editor.putInt("timehour", timehour); 
     editor.putInt("dateday", dateday); 
     editor.putInt("datemonth", datemonth); 
     editor.putInt("dateyear", dateyear); 
     editor.putInt("ampm", ampm); 
     editor.putString("daytext", daytext); 
     editor.putString("ampmtext", ampmtext); 
     editor.commit(); 
    } 


    private void initialize() { 
     // TODO Auto-generated method stub 
     aziangle=(TextView)findViewById(R.id.tvAziAngle); 
     elevation=(TextView)findViewById(R.id.tvElevation); 
     numberof=(TextView)findViewById(R.id.tvNumberof); 
     rightasc=(TextView)findViewById(R.id.tvRightAsc); 
     decli=(TextView)findViewById(R.id.tvDecli); 
     hourangle=(TextView)findViewById(R.id.tvHourAngle); 
     solartime=(TextView)findViewById(R.id.tvSolarTime); 
     showday=(TextView)findViewById(R.id.tvDay); 
     showdate=(TextView)findViewById(R.id.tvDate); 
     showtime=(TextView)findViewById(R.id.tvTime); 
     showinlat=(TextView)findViewById(R.id.tvShowInLat); 
     showinlong=(TextView)findViewById(R.id.tvShowInLong); 
     showintimezone=(TextView)findViewById(R.id.tvShowInTimeZone); 
     showindlst=(TextView)findViewById(R.id.tvShowInDLST); 
     showinofftime=(TextView)findViewById(R.id.tvShowInOffTime); 
     showinoffazi=(TextView)findViewById(R.id.tvShowInOffAzimuth); 
     showinoffele=(TextView)findViewById(R.id.tvShowInOffElevation); 
     showinoffphi=(TextView)findViewById(R.id.tvShowInOffphi); 
     showinofflamda=(TextView)findViewById(R.id.tvShowInOfflamda); 
     showinoffxi=(TextView)findViewById(R.id.tvShowInOffxi); 
     editting=(Button)findViewById(R.id.bedit); 
     editting.setOnClickListener(this); 
     } 


    private void loadSavedpreferences() { 
     // TODO Auto-generated method stub 
     SharedPreferences savedata= getSharedPreferences("savealldata",0); 
     //input 
     sshowday=savedata.getString("daytext",null); 
     showday.setText(sshowday); 

     takedateday=savedata.getInt("dateday",00); 
     takedatemonth=savedata.getInt("datemonth", 00); 
     takedateyear=savedata.getInt("dateyear", 00); 
     showdate.setText(takedateday + "/" + takedatemonth + "/" + takedateyear); 

     taketimesec=savedata.getInt("timesec", 00); 
     taketimeminute=savedata.getInt("timeminute", 00); 
     taketimehour=savedata.getInt("timehour", 00); 
     takeampmtext=savedata.getString("ampmtext", "AM"); 
     showtime.setText(taketimehour + ":" + taketimeminute + ":" + taketimesec + takeampmtext); 

     show1=savedata.getString("show1",null); 
     latval=savedata.getFloat("latval", 0); 
     showinlat.setText("Latitude : " + latval + ", " + show1); 

     show2=savedata.getString("show2",null); 
     longval=savedata.getFloat("longval",0); 
     showinlong.setText("Longitude : " + longval + ", " + show2); 

     show3=savedata.getString("show3",null); 
     timeval=savedata.getInt("timezoneval",0); 
     showintimezone.setText("Time Zone : " + timeval + show3); 

     show4=savedata.getString("show4","No"); 
     showindlst.setText("Daylight Saving Time : "+ show4); 

     offtimeval=savedata.getFloat("show5",0); 
     showinofftime.setText("Offset Time : " + offtimeval); 

     offazival=savedata.getFloat("show6",0); 
     showinoffazi.setText("Offset Azimuth : "+ offazival); 

     offeleval=savedata.getFloat("show7",0); 
     showinoffele.setText("Offset Elevation : " + offeleval); 

     offphival=savedata.getFloat("show8", 0); 
     showinoffphi.setText("Offset Φ :" + offphival); 

     offlamdaval=savedata.getFloat("show9", 0); 
     showinofflamda.setText("Offset λ : "+offlamdaval); 

     offxival=savedata.getFloat("show10", 0); 
     showinoffxi.setText("Offset ξ : "+ offxival); 
     //output 
     showazi=savedata.getString("azimuth", null); 
     aziangle.setText("Azimuth Angle : " + showazi); 

     showele=savedata.getString("elevation", null); 
     elevation.setText("Elevation Angle" + showele); 

     shownoday=savedata.getString("jd", null); 
     numberof.setText("Number of Days : " + shownoday); 

     showra=savedata.getString("RA", null); 
     rightasc.setText("Right Ascension : " + showra); 

     showdecli=savedata.getString("declination", null); 
     decli.setText("Declination Angle : " + showdecli); 

     showh_angle=savedata.getString("h_angle", null); 
     hourangle.setText("Hour Angle : " + showh_angle); 

     shows_time=savedata.getString("s_time", null); 
     solartime.setText("Solar Time : " + shows_time); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 

    @Override 
    public void onClick(View v) { 
     // TODO Auto-generated method stub 
     shutdown = true; 
     Intent e = new Intent(MainActivity.this,Parameterlist.class); 
     startActivity(e); 
    } 
    @Override 
    protected void onDestroy() { 
     // TODO Auto-generated method stub 
     super.onDestroy(); 
     shutdown = true ; 
    } 


} 

回答

1

你寫的

while(!shutdown) { 

你應該

while (true) { 

相反也改變

@Override 
protected void onDestroy() { 
    // TODO Auto-generated method stub 
    super.onDestroy(); 
    shutdown = true ; 
} 

@Override 
protected void onDestroy() { 
    // TODO Auto-generated method stub 
    shutdown = true ; 
    super.onDestroy(); 
} 
+0

但你看到如果我使用時(!shutdown)替換while(true)時,thread.start()不受影響,那麼線程將繼續運行。 – user3008754

+0

如果添加while(!shutdown),則線程將只運行,只要shutdown假,所以當你關閉真正的時候,這個時間將停止,並且線程將會縮短y之後。您無法直接停止線程。 – Korebian

+0

我已經改變了。我知道這些內容從一開始就不會運行。我張貼編輯的一個。 – user3008754

0

我也新到Android,但你可以嘗試調用這個在您的按鈕的onClick方法:

if(shutdown){ 

     mHandler.removeCallbacksAndMessages(runnable); 
     thread.interrupt() 
    } 
+0

仍然無法正常工作,順便說一句,我得到了錯誤的線thread.interrupt(),它建議我寫thread.interrupted(),我猜它是不同的東西 – user3008754