I want to make post on network whenever i receive sms the broadcastreciever call IntentService method but it give me following error
Activity stop timeout for ActivityRecord{420eec20 u0 com.example.myapp/.LoginActivity}
11-29 00:03:23.486 W/System.err﹕ android.os.NetworkOnMainThreadException
11-29 00:03:23.591 W/System.err﹕ at
android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1118)
11-29 00:03:23.596 I/dalvikvm﹕ Wrote stack traces to '/data/anr/traces.txt'
11-29 00:03:23.596 W/System.err﹕ at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:84)
11-29 00:03:23.601 W/System.err﹕ at libcore.io.IoBridge.connectErrno(IoBridge.java:127)
11-29 00:03:23.606 W/System.err﹕ at libcore.io.IoBridge.connect(IoBridge.java:112)
11-29 00:03:23.611 W/System.err﹕ at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192)
11-29 00:03:23.616 W/System.err﹕ at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:459)
I know that in service we cannot use internet long processes because of mainthread but intentservice is independant let me show the code
MAIN ACTIVITY
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
final Intent intent = new Intent(this,AndroService.class);
this.startService(intent);
}
Service Class
import org.json.JSONException;
import org.json.JSONObject;
public class AndroService extends IntentService
{
UsrAction upPayload;
private String smsURL = "exampleurl";
private HttpClientClass usrpayloader;
public AndroService() {
super("MyApp");
}
public AndroService(String name) {
super("MyApp");
}
@Override
protected void onHandleIntent(Intent intent) {
Toast.makeText(this, "Service started", Toast.LENGTH_SHORT).show();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
onHandleIntent(intent);
return 1;
}
public enum RequestMethod
{
GET,POST
}
public void smspayload(Context context, String strBody)
{
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context);
String cookievalue = sharedPreferences.getString("androsession", null);
usrpayloader.AddParam("smsbody", strBody);
usrpayloader.AddHeader(cookievalue,"value");
try {
usrpayloader.Execute(RequestMethod.POST);
}
catch (Exception e) {
e.printStackTrace();
}
String fetchdata = usrpayloader.getResponse();
try {
JSONObject json = new JSONObject(fetchdata);
} catch (JSONException e) {
e.printStackTrace();
}
}
}
BroadcastReceiver class
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsMessage;
import android.util.Log;
import android.widget.Toast;
public class broadcaster extends BroadcastReceiver
{
private final String TAG = "Hello";
private HttpClientClass usrpayloader;
private AndroService servusr;
@Override
public void onReceive(Context context, Intent intent)
{
Bundle extras = intent.getExtras();
String strMessage = "";
String strSrc="";
String strBody ="";
long time = 0;
if ( extras != null )
{
Object[] smsextras = (Object[]) extras.get( "pdus" );
for ( int i = 0; i < smsextras.length; i++ )
{
SmsMessage smsmsg = SmsMessage.createFromPdu((byte[])smsextras[i]);
String strMsgBody = smsmsg.getMessageBody().toString();
String strMsgSrc = smsmsg.getOriginatingAddress();
strSrc = strMsgSrc;
strBody = strMsgBody;
time = smsmsg.getTimestampMillis();
strMessage += "SMS from " + strMsgSrc + " : " + strMsgBody;
Log.i(TAG, strMessage);
}
Toast.makeText(context,strMessage,Toast.LENGTH_SHORT).show();
servusr = new AndroService();
servusr.smspayload(context,strBody,strSrc,time);
}
}
}
The question is how can i pass android.os.NetworkOnMainThreadException error and i want to use intentservice methods so is that a good practice to declare object into broadcastreceiver?