Android:AsyncTask正在抛出错误
我正在尝试让我的第一个Android服务开始工作。我有一个基本上生成随机数的服务。我想让它使用这个服务更新Android视图上的文本。我正在调度一个AsyncTask,它成功地更新了文本,但由于某种原因,我在日志中得到了这个异常。例外情况如下:Android:AsyncTask正在抛出错误,android,service,Android,Service,我正在尝试让我的第一个Android服务开始工作。我有一个基本上生成随机数的服务。我想让它使用这个服务更新Android视图上的文本。我正在调度一个AsyncTask,它成功地更新了文本,但由于某种原因,我在日志中得到了这个异常。例外情况如下: 03-20 09:58:37.242: ERROR/AndroidRuntime(594): FATAL EXCEPTION: AsyncTask #1 java.lang.RuntimeException: An error occur
03-20 09:58:37.242: ERROR/AndroidRuntime(594): FATAL EXCEPTION: AsyncTask #1
java.lang.RuntimeException: An error occured while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:200)
at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
at java.util.concurrent.FutureTask.run(FutureTask.java:137)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561)
at java.lang.Thread.run(Thread.java:1096)
Caused by: java.lang.NullPointerException
at com.denniss.Main$2.doInBackground(Main.java:51)
at com.denniss.Main$2.doInBackground(Main.java:47)
at android.os.AsyncTask$2.call(AsyncTask.java:185)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
... 4 more
03-20 09:58:37.272: WARN/ActivityManager(58): Force finishing activity com.denniss/.Main
03-20 09:58:39.051: ERROR/ActivityThread(594): Activity com.denniss.Main has leaked ServiceConnection com.denniss.Main$1@44e87110 that was originally bound here
android.app.ServiceConnectionLeaked: Activity com.denniss.Main has leaked ServiceConnection com.denniss.Main$1@44e87110 that was originally bound here
at android.app.ActivityThread$PackageInfo$ServiceDispatcher.<init>(ActivityThread.java:1121)
at android.app.ActivityThread$PackageInfo.getServiceDispatcher(ActivityThread.java:1016)
at android.app.ContextImpl.bindService(ContextImpl.java:863)
at android.content.ContextWrapper.bindService(ContextWrapper.java:347)
at com.denniss.Main.onStart(Main.java:73)
at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1129)
at android.app.Activity.performStart(Activity.java:3781)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2636)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
at android.app.ActivityThread.access$2300(ActivityThread.java:125)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:4627)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:521)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
at dalvik.system.NativeStart.main(Native Method)
03-20 09:58:37.242:错误/AndroidRuntime(594):致命异常:AsyncTask#1
java.lang.RuntimeException:执行doInBackground()时出错
在android.os.AsyncTask$3.done(AsyncTask.java:200)
位于java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
位于java.util.concurrent.FutureTask.setException(FutureTask.java:124)
位于java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
位于java.util.concurrent.FutureTask.run(FutureTask.java:137)
位于java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068)
位于java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561)
运行(Thread.java:1096)
原因:java.lang.NullPointerException
com.denniss.Main$2.doInBackground(Main.java:51)
com.denniss.Main$2.doInBackground(Main.java:47)
位于android.os.AsyncTask$2.call(AsyncTask.java:185)
位于java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
... 4更多
03-20 09:58:37.272:WARN/ActivityManager(58):强制完成活动com.denniss/.Main
03-20 09:58:39.051:错误/活动线程(594):活动com.denniss.Main已泄漏ServiceConnection com.denniss.Main$1@44e87110原来是订在这里的
android.app.ServiceConnection泄漏:Activity com.denniss.Main已泄漏ServiceConnection com.denniss.Main$1@44e87110原来是订在这里的
位于android.app.ActivityThread$PackageInfo$ServiceDispatcher。(ActivityThread.java:1121)
在android.app.ActivityThread$PackageInfo.getServiceDispatcher(ActivityThread.java:1016)上
位于android.app.ContextImpl.bindService(ContextImpl.java:863)
位于android.content.ContextWrapper.bindService(ContextWrapper.java:347)
位于com.denniss.Main.onStart(Main.java:73)
位于android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1129)
位于android.app.Activity.performStart(Activity.java:3781)
在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2636)上
位于android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
在android.app.ActivityThread.access$2300(ActivityThread.java:125)
在android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)上
位于android.os.Handler.dispatchMessage(Handler.java:99)
位于android.os.Looper.loop(Looper.java:123)
位于android.app.ActivityThread.main(ActivityThread.java:4627)
位于java.lang.reflect.Method.Invokenactive(本机方法)
位于java.lang.reflect.Method.invoke(Method.java:521)
在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)上
位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
在dalvik.system.NativeStart.main(本机方法)
Main.java
public class Main extends Activity {
private IRandomNumberService randomNumberService;
private int currentNumber = -1;
private boolean connected = false;
private TextView randomNumberText;
private ServiceConnection serviceConnection;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
System.out.println("******** onCreate");
setContentView(R.layout.main);
randomNumberText = (TextView) findViewById(R.id.random_number);
serviceConnection = new ServiceConnection() {
public void onServiceConnected(ComponentName componentName, IBinder service) {
System.out.println("onService Connected Called");
currentNumber = 1;
randomNumberService = IRandomNumberService.Stub.asInterface(service);
}
public void onServiceDisconnected(ComponentName componentName) {
System.out.println("Service Disconnected");
randomNumberService = null;
}
};
new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... voids) {
try {
currentNumber = randomNumberService.getRandomNumber();
System.out.println("Current Number: " + currentNumber);
} catch (RemoteException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
System.out.println("Setting Current Number: " + currentNumber);
randomNumberText.setText(new Integer(currentNumber).toString());
}
}.execute();
}
@Override
protected void onStart() {
super.onStart();
System.out.println("******** on Start");
if (!connected) {
connected = bindService(new Intent(Main.this, RandomNumberService.class), serviceConnection, Context.BIND_AUTO_CREATE);
Log.i("Service Status: ", "Connected? " + connected);
}
if (!connected) {
throw new RuntimeException("Cannot connect to service");
}
}
}
public类主扩展活动{
私有iRandomNumber服务RandomNumber服务;
私有int currentNumber=-1;
私有布尔连接=假;
私有文本视图随机数文本;
专用服务连接服务连接;
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
System.out.println(“*********onCreate”);
setContentView(R.layout.main);
randomNumberText=(TextView)findViewById(R.id.random_number);
serviceConnection=新的serviceConnection(){
服务连接上的公共无效(组件名称组件名称,IBinder服务){
System.out.println(“被调用的服务连接”);
currentNumber=1;
randomNumberService=IRandomNumberService.Stub.asInterface(服务);
}
ServiceDisconnected上的公共无效(ComponentName ComponentName){
系统输出打印项次(“服务断开”);
randomNumberService=null;
}
};
新建异步任务(){
@凌驾
受保护的空位背景(空位…空位){
试一试{
currentNumber=randomNumberService.getRandomNumber();
System.out.println(“当前编号:+currentNumber”);
}捕获(远程异常){
e、 printStackTrace();
}
返回null;
}
@凌驾
受保护的void onPostExecute(void避免){
super.onPostExecute(避免);
System.out.println(“设置当前编号:+currentNumber”);
randomNumberText.setText(新整数(currentNumber.toString());
}
}.execute();
}
@凌驾
受保护的void onStart(){
super.onStart();
System.out.println(“启动时的******”);
如果(!已连接){
connected=bindService(新意图(Main.this、RandomNumberService.class)、serviceConnection、Context.BIND\u AUTO\u CREATE);
Log.i(“服务状态:,“已连接?”+已连接”);
}
如果(!已连接){
抛出新的RuntimeException(“无法连接到服务”);
}
}
}
看起来randomNumberService为空,当您调用randomNumberService.getRandomNumber()时;它抛出空指针异常
在执行异步任务之前,您应该等待服务连接完成,因为它依赖于您的服务连接。很可能获取randomNumberService的服务完成的速度不够快,您的异步任务无法获得RandomNumber的有效值