Android挑战:跳过帧...关闭VM ... NULLPointerException ..将Intent数据返回到onActivityResult

时间:2013-05-02 17:18:15

标签: android-intent android-asynctask nullpointerexception

我有一点挑战......以下是高级别:

从用户的角度来看:

他们获得一个活动(StockCountListActivity),向他们展示未结库存计数列表 - 他们选择一个并转到另一个活动(StockCountActivity),向他们展示他们可以更新qtys的所有项目。

在幕后:

这两项活动的数据来自网络服务......我已将以下课程作为帮助者编写:

public class WebServiceTask extends AsyncTask<String, Integer, String>

使用惯用的异步方法......它的魔力没有问题......最后调用

@Override
protected void onPostExecute(String result) {
     resultString = result;
    _listener.handleResponse(taskNumber,scode,result);
    pDlg.dismiss();

}

其中_listener实际上是一个接口,我把它作为一个钩子写回到调用类(Activity)......按照以下内容:

public interface WebTaskListener {
    public void handleResponse(int tasknum, int scode, String result);
}
private WebTaskListener _listener;

到目前为止,所有这些都很有效......现在是挑战......在子活动的handleResponse(StockCountActivity)中,我有以下内容:

@Override
public void handleResponse(int tasknum, int scode, String result) {
    if (result == null)
        return;
    if (tasknum == PUTCOUNTITEMS_TASK)
    {
        Intent returnIntent = new Intent();
        returnIntent.putExtra("selGroup",-1);
        returnIntent.putExtra("selChild",-1);
        setResult(RESULT_OK,returnIntent);     
        this.finish();
    }

}

通过调试,我可以验证returnIntent在这里是否正确,并且已经使用-1值正确添加了额外内容...我的意图(没有双关语意)这里是涓流到StockCountListActivity(第一个用户对话框)并传递这些值。实际发生的事情是完全不同的......

首先......作为背景......我最初使用StockCountListActivity(第一个对话框)中的以下代码调用了StockCountActivity(第二个对话框):

    Intent startNewActivityOpen = new Intent(this, StockCountActivity.class);
    startNewActivityOpen.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    int newCountID = addNewCount(n);
    startNewActivityOpen.putExtra("CategoryID", n);
    startNewActivityOpen.putExtra("LoadType", "new");
    startNewActivityOpen.putExtra("CountID", newCountID);
    startNewActivityOpen.putExtra("selGroup", -1);
    startNewActivityOpen.putExtra("selChild", -1);
    startActivityForResult(startNewActivityOpen, 1);

最后......在这个冗长的解释之后......问题出现在StockCountListActivity的onActivityResult上。

    protected void onActivityResult(int requestCode, int resultCode, Intent data) {

        if (requestCode == 1 && data != null) {

            if (resultCode == RESULT_OK) {
                Bundle extras = getIntent().getExtras();
                if (extras != null) {
                    currentCount.selGroup = extras.getInt("selGroup", -1);
                    currentCount.selChild = extras.getInt("selChild", -1);
                }

数据没有额外的数据并且是空的,即使我已经确认它离开StockCountActivity也没关系。 logCat显示以下内容。

    05-02 09:39:59.664: I/Choreographer(16548): Skipped 3206 frames!  The application may be doing too much work on its main thread.
    05-02 09:44:30.304: D/AndroidRuntime(16548): Shutting down VM
    05-02 09:44:30.304: W/dalvikvm(16548): threadid=1: thread exiting with uncaught exception (group=0x40c15930)
    05-02 09:44:30.374: E/AndroidRuntime(16548): FATAL EXCEPTION: main
    05-02 09:44:30.374: E/AndroidRuntime(16548): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1, result=-1, data=Intent { flg=0x4000000 cmp=com.oat/.StockCount.StockCountActivity (has extras) }} to activity {com.oat/com.oat.StockCount.StockCountListActivity}: java.lang.NullPointerException
    05-02 09:44:30.374: E/AndroidRuntime(16548):    at android.app.ActivityThread.deliverResults(ActivityThread.java:3319)
    05-02 09:44:30.374: E/AndroidRuntime(16548):    at android.app.ActivityThread.handleSendResult(ActivityThread.java:3362)
    05-02 09:44:30.374: E/AndroidRuntime(16548):    at android.app.ActivityThread.access$1100(ActivityThread.java:141)
    05-02 09:44:30.374: E/AndroidRuntime(16548):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1282)
    05-02 09:44:30.374: E/AndroidRuntime(16548):    at android.os.Handler.dispatchMessage(Handler.java:99)
    05-02 09:44:30.374: E/AndroidRuntime(16548):    at android.os.Looper.loop(Looper.java:137)
    05-02 09:44:30.374: E/AndroidRuntime(16548):    at android.app.ActivityThread.main(ActivityThread.java:5041)
    05-02 09:44:30.374: E/AndroidRuntime(16548):    at java.lang.reflect.Method.invokeNative(Native Method)
    05-02 09:44:30.374: E/AndroidRuntime(16548):    at java.lang.reflect.Method.invoke(Method.java:511)
    05-02 09:44:30.374: E/AndroidRuntime(16548):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
    05-02 09:44:30.374: E/AndroidRuntime(16548):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
    05-02 09:44:30.374: E/AndroidRuntime(16548):    at dalvik.system.NativeStart.main(Native Method)
    05-02 09:44:30.374: E/AndroidRuntime(16548): Caused by: java.lang.NullPointerException
    05-02 09:44:30.374: E/AndroidRuntime(16548):    at com.oat.StockCount.StockCountListActivity.onActivityResult(StockCountListActivity.java:323)
    05-02 09:44:30.374: E/AndroidRuntime(16548):    at android.app.Activity.dispatchActivityResult(Activity.java:5293)
    05-02 09:44:30.374: E/AndroidRuntime(16548):    at android.app.ActivityThread.deliverResults(ActivityThread.java:3315)
    05-02 09:44:30.374: E/AndroidRuntime(16548):    ... 11 more

总而言之,事件顺序如下 1)WebServiceTask(一个AsyncTask)完成其工作然后再完成 2)回调StockCountActivity的handleResponse方法
3)反过来创建returnIntent并完成活动
4)然后返回StockCountListActivity的onActivityResult方法

我认为真正的问题是告诉我主线程上发生了太多事情然后关闭虚拟机的消息。一旦发生这种情况,我就能理解为什么Intent数据会丢失。我只是不知道为什么抱怨我在主线程上做了太多工作。

我确定我做的事情很愚蠢。任何帮助将不胜感激 感谢

1 个答案:

答案 0 :(得分:0)

好的......经过多个小时的调试和研究......在下面找到了一个很好的答案:

android return activity extras returns null

似乎真正的问题在于以下这一行:

                Bundle extras = getIntent().getExtras();

它应该是:

            Bundle extras = data.getExtras();