2016-04-29 3 views
-2

Я пытаюсь запустить countdowntimer в фоновом режиме, чтобы сделать некоторые вычисления с помощью AsyncTask, но я получаю эту ошибкупроизошла ошибка при выполнении doInBackground() во время бега Countdowntimer

Это мой код

public class CurrentStatus extends AsyncTask<Context,Void,Context> { 

float BatteryStatus; 
int TimeStatus,HoursToCharge; 
String USID, BatteryID, NetworkID, NetworkStatus, roamingLevel, 
    TimeID,ETTC,DischargeRate; 
int dischargeRate; 
Context newContext; 
SharedPreferences sharedPreferences; 





public float getBatteryLevel(Context context) 
{ 
    Intent batteryIntent = context.registerReceiver(null, new  
IntentFilter(Intent.ACTION_BATTERY_CHANGED)); 
int level = batteryIntent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1); 
int scale = batteryIntent.getIntExtra(BatteryManager.EXTRA_SCALE, -1); 
    return ((float) level/(float) scale) * 100.0f; 

} 

public void getDischargeRate(final Context context) 
{ 
final int currentBattery=(int)getBatteryLevel(context); 
int q=0; 
sharedPreferences=context.getSharedPreferences 
    ("MyDischargePref" ,Context.MODE_PRIVATE); 

final SharedPreferences.Editor editor1=sharedPreferences.edit(); 
new CountDownTimer(120000,600) 
{ 
    int BatteryDischargeRate; 
    public void onTick(long millisUntilFinished) 
    { 
     System.out.println(" seconds"+currentBattery); 
    } 
    int afterUsage; 
    public void onFinish() 
    { 
     afterUsage = (int)getBatteryLevel(context); 
     System.out.println("On Finish: "+ afterUsage); 
     BatteryDischargeRate=currentBattery-afterUsage; 
     System.out.println("Entering preference. BYE!  
     "+BatteryDischargeRate); 



editor1.putString("DischargeRate",Integer.toString(BatteryDischargeRate)); 

     } 
}.start(); 

} 


public String getNetworkInterface(Context context) { 

WifiManager wifi = (WifiManager)  context.getSystemService(Context.WIFI_SERVICE); 
if (wifi.isWifiEnabled()) 
    return "On"; 
else 
    return "Off"; 

} 

public String getRoaming(Context context) { 
boolean x = false; 
TelephonyManager telephoneManager; 
telephoneManager = (TelephonyManager)  
context.getSystemService(Context.TELEPHONY_SERVICE); 
x = telephoneManager.isNetworkRoaming(); 
if (x) 
    return "On"; 
else 
    return "Off"; 
} 

public String getDataConnectionType(Context context) { 
TelephonyManager telephoneManager; 
telephoneManager = (TelephonyManager) 
context.getSystemService(Context.TELEPHONY_SERVICE); 
int a = telephoneManager.getNetworkType(); 

switch (a) { 
    case TelephonyManager.NETWORK_TYPE_1xRTT: 
    case TelephonyManager.NETWORK_TYPE_CDMA: 
    case TelephonyManager.NETWORK_TYPE_GPRS: 
    case TelephonyManager.NETWORK_TYPE_IDEN: 
    case TelephonyManager.NETWORK_TYPE_EDGE: 
     String nw = "00"; 
     return "2G"; 
    case TelephonyManager.NETWORK_TYPE_UMTS: 
    case TelephonyManager.NETWORK_TYPE_EVDO_0: 
    case TelephonyManager.NETWORK_TYPE_EVDO_A: 
    case TelephonyManager.NETWORK_TYPE_HSDPA: 
    case TelephonyManager.NETWORK_TYPE_HSUPA: 
    case TelephonyManager.NETWORK_TYPE_HSPA: 
    case TelephonyManager.NETWORK_TYPE_EVDO_B: 
    case TelephonyManager.NETWORK_TYPE_EHRPD: 
    case TelephonyManager.NETWORK_TYPE_HSPAP: 
     nw = "01"; 
     return "3G"; 
    case TelephonyManager.NETWORK_TYPE_LTE: 
     nw = "11"; 
     return "4G"; 
    default: 
     return "Unknown"; 
} 
} 

public String getDataMode(Context context) { 
ConnectivityManager cm = (ConnectivityManager) 
context.getSystemService(Context.CONNECTIVITY_SERVICE); 
NetworkInfo activeNetwork = cm.getActiveNetworkInfo(); 
boolean x = activeNetwork != null && 
activeNetwork.isConnectedOrConnecting(); 
if (x) { 
    if (activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE) 
     return "On"; 
    else 
     return "Off"; 
} else 
    return "No Active Network"; 
} 



public void retrieveStatus(Context context) { 

Context retrieveContext=context; 
SharedPreferences sharedPreferences=retrieveContext.getSharedPreferences("MyPref", Context.MODE_PRIVATE); 


BatteryStatus = getBatteryLevel(retrieveContext); 
if (BatteryStatus > 5 && BatteryStatus < 25) { 
    BatteryID = "11"; 
} 
if (BatteryStatus > 25 && BatteryStatus < 50) { 
    BatteryID = "10"; 
} 
if (BatteryStatus > 50 && BatteryStatus < 75) { 
    BatteryID = "01"; 
} 
if (BatteryStatus > 75 && BatteryStatus < 100) { 
    BatteryID = "00"; 
} 

NetworkID = getNetworkInterface(retrieveContext); 
if (NetworkID == "ON") { 
    NetworkID = getDataConnectionType(retrieveContext); 
    if (NetworkStatus == "3G") { 
     NetworkStatus = "11"; 
    } 
    if (NetworkStatus == "2G") { 
     NetworkStatus = "10"; 
    } 
} else { 
    NetworkStatus = "00"; 
} 
NetworkID = getNetworkInterface(retrieveContext); 
if (NetworkID == "On") { 
    NetworkStatus = "01"; 
} 

roamingLevel = getRoaming(retrieveContext); 
if (roamingLevel.equals("On")) { 
    roamingLevel = "1"; 
} else { 
    roamingLevel = "0"; 
} 
ETTC=(sharedPreferences.getString("ETTC","")); 

HoursToCharge=Integer.parseInt(ETTC); 
if (HoursToCharge > 12) { 
    TimeID = "11"; 
} 
if (HoursToCharge > 6 && HoursToCharge < 12) { 
    TimeID = "10"; 
} 
if (HoursToCharge > 3 && HoursToCharge < 6) { 
    TimeID = "01"; 
} 
if (HoursToCharge > 0 && HoursToCharge < 3) { 
    TimeID = "00"; 
} 

DischargeRate=(sharedPreferences.getString("MyDischargePref","")); 
    System.out.println("Battery id:"+BatteryID); 
System.out.println("ETTC:"+TimeID); 
System.out.println("Network Status:"+NetworkStatus); 
System.out.println("DischargeRate"+DischargeRate); 
System.out.println("Roaming"+roamingLevel); 

}

@Override 
protected Context doInBackground(Context... params) { 
Context backgroundcontext; 

backgroundcontext=params[0]; 
getDischargeRate(backgroundcontext); 
return backgroundcontext; 
} 


@Override 
protected void onPostExecute(Context context) { 

retrieveStatus(context); 

} 

} 

и это LogCat

04-30 02:32:21.697 30111-30974/com.first.shash_000.anantha E/AndroidRuntime:  FATAL EXCEPTION: AsyncTask #1 
04-30 02:32:21.697 30111-30974/com.first.shash_000.anantha E/AndroidRuntime: Process: com.first.shash_000.anantha, PID: 30111 
04-30 02:32:21.697 30111-30974/com.first.shash_000.anantha E/AndroidRuntime: java.lang.RuntimeException: An error occured while executing doInBackground() 
04-30 02:32:21.697 30111-30974/com.first.shash_000.anantha E/AndroidRuntime:  at android.os.AsyncTask$3.done(AsyncTask.java:304) 
04-30 02:32:21.697 30111-30974/com.first.shash_000.anantha E/AndroidRuntime:  at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355) 
04-30 02:32:21.697 30111-30974/com.first.shash_000.anantha E/AndroidRuntime:  at java.util.concurrent.FutureTask.setException(FutureTask.java:222) 
04-30 02:32:21.697 30111-30974/com.first.shash_000.anantha E/AndroidRuntime:  at java.util.concurrent.FutureTask.run(FutureTask.java:242) 
04-30 02:32:21.697 30111-30974/com.first.shash_000.anantha E/AndroidRuntime:  at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 
04-30 02:32:21.697 30111-30974/com.first.shash_000.anantha E/AndroidRuntime:  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
04-30 02:32:21.697 30111-30974/com.first.shash_000.anantha E/AndroidRuntime:  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
04-30 02:32:21.697 30111-30974/com.first.shash_000.anantha E/AndroidRuntime:  at java.lang.Thread.run(Thread.java:818) 
04-30 02:32:21.697 30111-30974/com.first.shash_000.anantha E/AndroidRuntime: Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() 
04-30 02:32:21.697 30111-30974/com.first.shash_000.anantha E/AndroidRuntime:  at android.os.Handler.<init>(Handler.java:200) 
04-30 02:32:21.697 30111-30974/com.first.shash_000.anantha E/AndroidRuntime:  at android.os.Handler.<init>(Handler.java:114) 
04-30 02:32:21.697 30111-30974/com.first.shash_000.anantha E/AndroidRuntime:  at android.os.CountDownTimer$1.<init>(CountDownTimer.java:114) 

04-30 02: 32: 21.697 30111-30974/com.first.shash_000.anantha E/AndroidRuntime: at android.os.CountDownTimer. (CountDownTimer.java:114) 04-30 02: 32: 21.697 30111 -30974/com.first.shash_000.anantha E/AndroidRuntime: at com.first.shash_000.anantha.CurrentStatus $ 1. (CurrentStatus.java:55) 04-30 02: 32: 21.697 30111-30974/com.first. shash_000.anantha E/AndroidRuntime: at com.first.shash_000.anantha.CurrentStatus.getDischargeRate (CurrentStatus.java:54) 04-30 02: 32: 21.697 30111-30974/com.first.shash_000.anantha E/AndroidRuntime: at com.first.shash_000.anantha.CurrentStatus.doInBackground (CurrentStatus.java:226) 04-30 02: 32: 21.697 30111-30974/com.first.shash_000.anantha E/AndroidRuntime: at com.first.shash_000. anantha.CurrentStatus.doInBackground (CurrentStatus.java:26) 04-30 02: 32: 21.697 30111-30974/com.first.shash_000.anantha E/AndroidRuntime: at android.os.AsyncTask $ 2.call (AsyncTask.java:292)

+2

Возможный дубликат [Async Task Ошибка при выполнении doInBackground()] (http : //stackoverflow.com/questions/8172338/async-task-an-error-occured-while-executing-doinbackground) Вам нужно вызвать 'Looper.prepare()' – ChrisStillwell

ответ

0

Вы не должны ставить свои CountDownTimer внутри doInBackground(), подумайте об изменении логики кода для запуска таймера в основном потоке, в onPostExecute (контекст контекста), например

+0

, когда я запускаю таймер в основном потоке, выполнение не ожидает указанного времени countDown, вместо этого он печатает оставшиеся данные, отличные от скорости разряда. – Shashank