AsyncTask中的onPostExecute与BroadcastReceiver抛出空指针异常

时间:2015-04-23 20:09:33

标签: java android android-asynctask broadcastreceiver

收到新消息后,应将消息传递到互联网以获取更多业务逻辑。

要接收我在onreceive of broadcastreceiver上使用的新消息,并在后台处理互联网业务逻辑,我使用了AsyncTask。

我在AyncTask的onPostExecute方法中获取空指针异常,我读了很多stackoverflow和其他网站解决方案并创建了接口并在AsyncTask扩展类构造函数中初始化它。但只获得nullpointer。

我的完整代码:

MainActivity:

public class SmsActivity extends Activity implements     ParseURL.OnAsyncRequestComplete {
private static SmsActivity inst;
public static final String SMS_BUNDLE = "pdus";
public static SmsActivity instance() {
    return inst;
}

@Override
public void onStart() {
    super.onStart();
    inst = this;
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_sms);
}

@Override
public void processResp(String output){
    String outpu1 = output+" in main";
}

}

广播接收器:

public class SmsBroadcastReceiver extends BroadcastReceiver{
public static final String SMS_BUNDLE = "pdus";
public void onReceive(Context context, Intent intent) {
    Bundle intentExtras = intent.getExtras();
    if (intentExtras != null) {
        Object[] sms = (Object[]) intentExtras.get(SMS_BUNDLE);
        String smsMessageStr = "";

        boolean rechargeResult = false;
        for (int i = 0; i < sms.length; ++i) {
            SmsMessage smsMessage = SmsMessage.createFromPdu((byte[]) sms[i]);
            String smsBody = smsMessage.getMessageBody().toString();
            String address = smsMessage.getOriginatingAddress();
            smsMessageStr += "SMS From: " + address + "\n";
                if (smsBody != null) {
                    String[] splitValues = smsBody.split(" ");
                    if (splitValues != null && splitValues.length > 0) {
                        String siteURL = "SITE_URL";
                        try {
                            ParseURL.OnAsyncRequestComplete procesInterf = null;
                            ParseURL urlParse = new ParseURL(procesInterf);
                            Toast.makeText(context, siteURL, Toast.LENGTH_LONG).show();
                            new ParseURL(procesInterf).execute(new String[]{siteURL});
                        } catch (Exception e) {
                            Toast.makeText(context, "123 "+e.getMessage(), Toast.LENGTH_LONG).show();
                        }
                    } else {
                        Toast.makeText(context, "split values is null", Toast.LENGTH_LONG).show();
                    }
                else {
                    Toast.makeText(context, "smsbody is null", Toast.LENGTH_LONG).show();
                }
            }
        }
    }
}

}

的parseURL:

public class ParseURL extends AsyncTask<String, Void, String> {


ProgressDialog progressDialog;

OnAsyncRequestComplete caller;
//Context context;


public ParseURL(OnAsyncRequestComplete a) {
    caller = a;
   // context = a;
}

public interface OnAsyncRequestComplete {
    public void processResp(String response);
}


@Override
protected void onPreExecute()
{
    progressDialog.setMessage("WAIT...");
    progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
    progressDialog.setCancelable(false);
    progressDialog.show();
}



@Override
protected String doInBackground(String... strings) {
    String responseStatus = "";
    try {
        if(strings!=null) {
            if (null != strings[0]) {
                Document doc = Jsoup.connect(strings[0]).timeout(0).get();
                if (doc != null) {
                    String result = doc.select("body").text();

                    if (null != result) {

                        if (result.toLowerCase().contains("FAILED".toLowerCase())) {
                            responseStatus = result;
                        } else if (result.toLowerCase().contains("SUCCESS".toLowerCase())) {
                            responseStatus = "SUCCESS";
                        } else {
                            responseStatus = "FAILED";
                        }
                    } else {
                        responseStatus = "google";
                    }
                } else {
                    responseStatus = "facebook";
                }
            } else {
                responseStatus = "youtube";
            }
        }else{
            responseStatus = "ebay";
        }
    } catch (Throwable t) {
        t.printStackTrace();
    }
    return responseStatus;
}


@Override
protected void onPostExecute(String s) {
    caller.processResp(s);
}

}

我尝试了很多在stackoverflow和其他网站中共享的解决方案。但我无法解决它。请不要将其标记为重复。

提前致谢。

2 个答案:

答案 0 :(得分:1)

Ohh maaan ......

ParseURL.OnAsyncRequestComplete procesInterf = null;
ParseURL urlParse = new ParseURL(procesInterf);
   public ParseURL(OnAsyncRequestComplete a) {
        caller = a;
    }
@Override
protected void onPostExecute(String s) {
    caller.processResp(s);
}

你看错了吗?

您将null传递给ParseUrl构造函数,因此PosteExecute()尝试调用null回调的方法。

我怀疑你想这样做

ParseURL.OnAsyncRequestComplete procesInterf = SmsActivity.this;

但如果您的SmsBroadcastReceiver类是SmsActivity的内部类,它将起作用。

答案 1 :(得分:0)

您永远不会初始化caller。基本上你将其设置为null,然后将其传递给AsyncTask,然后尝试使用它。

你已经在Activity中使用了单例模式,所以你可能在

之后

ParseURL.OnAsyncRequestComplete procesInterf = SmsActivity.instance();