2016-04-29 15 views
-2

Ich versuche, eine countdowntimer im Hintergrund zu laufen einige Berechnung durch AsyncTask zu tun, aber ich bin immer diesen FehlerFehler beim doInBackground Ausführung() während des Laufens Countdowntimer

Dies ist mein Code

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); 

} 

} 

und das ist 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) 

Februar 04-30: 32: 30.111 bis 30.974 21,697/com.first.shash_000.anantha E/Android Runtime. Bei android.os.CountDownTimer (CountDownTimer.java:114) Februar 04-30: 32: 21,697 30111 -30974/com.first.shash_000.anantha E/AndroidRuntime: um 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: um com.first.shash_000.anantha.CurrentStatus.getDischargerRate (CurrentStatus.java:54) 04-30 02: 32: 21,697 30111-30974/com.first.shash_000.anantha E/AndroidRuntime: unter 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. ananth.CurrentStatus.doInBackground (CurrentStatus.java:26) 04-30 02: 32: 21.697 30111-30974/com.first.shash_000.anantha E/AndroidRuntime: bei android.os.AsyncTask $ 2.Anruf (AsyncTask.java:292)

+2

Mögliche Duplikate von [Async Task Ein Fehler trat während der Ausführung von doInBackground()] (http : //stackoverflow.com/questions/8172338/async-task-an-error-occured-while-executing-doinbackground) Sie müssen 'Looper.prepare()' – ChrisStillwell

Antwort

0

Sie sollten nicht Ihre CountDownTimer in der doInBackground(), denken Sie daran, Ihre Code Logik zu ändern, um den Timer auf dem Hauptthread auszuführen, in onPostExecute (Kontext Kontext) zum Beispiel

+0

aufrufen, wenn ich den Timer auf Hauptthread ausführen, der Die Ausführung wartet nicht auf die angegebene countDown-Zeit, sondern druckt die restlichen Daten außer der Entladerate. – Shashank

Verwandte Themen