1

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

从用户的角度来看:

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

幕后花絮:

这两个活动的数据都来自网络服务......我编写了以下类作为助手:

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;

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

@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 方法

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

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

4

1 回答 1

0

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

android返回活动额外返回null

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

                Bundle extras = getIntent().getExtras();

它应该是:

            Bundle extras = data.getExtras();
于 2013-05-13T19:49:43.887 回答