2013-11-28 39 views
-4

我要讓網絡文章時,我收到短信broadcastreciever呼叫IntentService方法,但它給我下面的錯誤IntentService android.os.NetworkOnMainThreadException

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) 

我知道,在我們的服務不能使用互聯網一個漫長的過程,因爲mainthread 但intentservice是獨立的讓我告訴代碼

主要活動

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); 

} 

服務類

  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(); 
        } 
       } 
      } 

廣播接收器類

   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); 

         } 

        } 

       } 

的問題是如何傳遞android.os.NetworkOnMainThreadException錯誤 ,我想用intentservice方法,從而是將對象聲明爲broadcastreceiver的好習慣?

+0

當你爲這個(非常常見的)錯誤搜索或者在發佈之前在這裏搜索時,你學到了什麼? – Simon

+0

'NetworkOnMainThreadException'。去谷歌上查詢。 – Ahmad

+0

我GOOGLE了,看到類似的帖子在沙發上,但我沒有得到它如何刪除此錯誤.. 我不想使用ASYNC我只是想使用intentservice和broadcastreceiver 而我的朋友告訴我,下面的代碼是不是一個好的做法 StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()。permitAll()。build(); StrictMode.setThreadPolicy(policy); – Shayan

回答

2

您沒有正確使用IntentService

首先,千萬不要通過構造函數自己創建Service的實例。您通過startService()bindService()開始服務。在IntentService的情況下,startService()是典型的方法。

第二,smspayload()需要調用onHandleIntent()爲了它在由IntentService提供的後臺線程上處理。要將數據傳遞給它,請使用startService()將您的strBody作爲額外的包裝在Intent上使用。 onHandleIntent()然後可以調用getStringExtra()Intent來檢索參數並將其傳遞給smspayload()。您可以在smspayload()上刪除Context參數,並將context替換爲this,因爲ServiceContext

+0

感謝您的解決方案 – Shayan

+0

你能告訴我這是否是一種在收到消息時調用intent服務的好方法嗎? \t \t \t公共類ResponseReceiver擴展廣播接收器{ \t \t \t \t @覆蓋 \t \t \t \t公共無效的onReceive(上下文語境,意圖意圖){ \t \t \t \t \t //我的代碼 \t \t \t \t \t \t \t \t \t \t Intent i = new Intent(context,SimpleIntentService.class); \t \t \t \t \t i.putExtra(「string」,string); \t \t \t \t \t context.startService(i); \t \t \t \t} \t \t \t} – Shayan

+0

@Shayan:即興,這似乎是罰款。 – CommonsWare

相關問題