简体   繁体   English

Android:AsyncTask引发错误

[英]Android: AsyncTask is throwing error

I am trying to get my first Android service to work. 我正在尝试使我的第一个Android服务正常工作。 I have this service that basically generates random number. 我有这项服务,基本上会产生随机数。 I want it to update the text on the Android's view using this service. 我希望它使用此服务来更新Android视图上的文本。 I am dispatching an AsyncTask and it successfuly updates the text but for some reason I get this exception in Log. 我正在调度AsyncTask,它会成功更新文本,但是由于某种原因,我在Log中收到此异常。 Here's the exception: 这是例外:

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)

Main.java 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");
        }
    }
}

It looks like randomNumberService is null and when you call randomNumberService.getRandomNumber(); 看起来randomNumberService为null,并且在您调用randomNumberService.getRandomNumber();时, it throws the null pointer exception. 它抛出空指针异常。

You should wait until your service is connected before you execute your Async task since it is dependent on your service connecting. 您应该等到服务被连接后再执行异步任务,因为它取决于服务的连接。 Likely the service that fetches randomNumberService isn't completing fast enough for your Async task to have a valid value for randomNumberService 可能获取取randomNumberService的服务的完成速度不够快,以至于您的Async任务无法获得randomNumberService的有效值

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM