2017-11-26 6 views
0

私はアクティビティの開始から時間をカウントするアンドロイドアプリケーションを構築しています。初めてアクティビティを開始したときに、タイマーは正常に動作し、TextViewに時間が表示されます。 私は(電話をひっくり返す)の活動を終了し、タイマーが正常に動作再起動しよう(私はログとして表示)が、TextViewには、私が使用している方法でstart AsyncTask second time

override fun doInBackground(vararg params: Activity): String? { 
    val acc = Accelerometer(params[0]) 
    dealsList.forEach {Log.d("fallDeals", it) } 
    while (true) { 
     sleep(100) 
     publishProgress() 




     Log.i("TAG", "${tiltSensorsValues[0] - acc.xPos!!} ${tiltSensorsValues[1] - acc.yPos!!} ${acc.zPos!!}") 
     if (flippedPhone(acc)) { 
      Log.i("REFRENCES", "${dbRefrences.stateRef}") 
      dbRefrences.stateRef.setValue("empty") 
      addToOldDataTableDatabase() 
      return "Triggered" 
      break 

     } 
    } 
} 

private fun flippedPhone(acc: Accelerometer) = 
     (tiltSensorsValues[0] - acc.xPos!! < -4 || tiltSensorsValues[0] - acc.xPos!! > 4 || 
       tiltSensorsValues[1] - acc.yPos!! < -4 || tiltSensorsValues[1] - acc.yPos!! > 4) 


override fun onPostExecute(result: String?) { 
    super.onPostExecute(result) 
    dbRefrences.currentRef.child(USERS).removeValue() 
    dbRefrences.stateRef.setValue("empty") 
    Toast.makeText(context,setTimer(),Toast.LENGTH_SHORT).show() 

} 


//********************************************* 
//Functions 
//********************************************* 

/** 
* adding the data to the old data table 
*/ 
private fun addToOldDataTableDatabase() { 
    val oldDataTableRef = dbRefrences.tableRef.child(OLD_DATA) 
    oldDataTableRef.child(gDate()).child(getCurrentTime())?.child(TIME)?.setValue(timer.text) 
    Log.i("My Service", userList.size.toString()) 
    userList.forEach { 
     oldDataTableRef.child(gDate()).child(getCurrentTime())?.child(PARTICIPANTS)?. 
       child(it.userId)?.setValue(it.name) 
    } 

} 

private fun gDate(): String { 
    val c = Calendar.getInstance() 
    val df = SimpleDateFormat("dd-MM-yyyy") 
    return df.format(c.time) 
} 


/** 
* return the time that has passed since the group started 
*/ 
private fun setTimer(): String { 
    val difference = Calendar.getInstance().timeInMillis - startTime 
    val minutes = TimeUnit.MILLISECONDS.toMinutes(difference).rem(60) 
    val seconds = TimeUnit.MILLISECONDS.toSeconds(difference).rem(60) 
    val hours = TimeUnit.MILLISECONDS.toHours(difference).rem(24) 

    Log.i("TAG", "${String.format("%02d", hours)}:${String.format("%02d", minutes)}:${String.format("%02d", seconds)}") 
    return "${String.format("%02d", hours)}:${String.format("%02d", minutes)}:${String.format("%02d", seconds)}" 
} 

/** 
* changing the textView text to the time that has passed since they started 
*/ 
override fun onProgressUpdate(vararg values: Void?) { 
    super.onProgressUpdate(*values) 
    timer.text = setTimer() 


} 

を変更しない場合あなたの問題を解決するため

+0

AsyncTaskは、あなたの活動の参照を保持し、あなたが原因AsyncTaskと古いAsynctTaskのまだ古い1あなたの活動を再作成するたびに、まだ実行されています、それであなたは私にog。このコードはすべて、コードを書くべきではありません。 –

+0

'私がアクティビティを終えると(電話をひっくり返して)、もう一度やり直してください。あなたが何をやり直そうとしているのかは不明です。さらに、asynctasksは再起動できません。新しいasynctaskを作成する必要があります。 – greenapps

+0

私の神... @Bernouilli Gateあなたはすべての投稿の編集をやめることができますか?かなりannoing。私はOPがあなただったことを発見するために編集したものをチェックしていました。 – greenapps

答えて

0

シンプルなタイマーアプリケーションは、この方法を実装することができkotlin:

class TimerApp : Application() {//TODO add TimerApp to manifest 
    val startTime: Long by lazy { System.currentTimeMillis() } 

    companion object { 
     lateinit var instance: TimerApp 
      private set 
    } 

    override fun onCreate() { 
     super.onCreate() 
     instance = this 
    } 

} 

class FirstActivity : AppCompatActivity() { 
    override fun onCreate(savedInstanceState: Bundle?) { 
     super.onCreate(savedInstanceState) 
     //init your views 
     val timerTV = TextView(this) 
     timerTV.postDelayed({ timerTV.text = TimerApp.instance.startTime.getElapsed() }, 1000) 
    } 
} 

fun Long.getElapsed(): String { 
    val delta = System.currentTimeMillis() - this //elapsed time in ms 
    TODO("return formatted string") 
}