2014-10-27 86 views
0

我試圖通過後臺服務將數據發佈到web服務器。通過服務發佈數據導致應用程序崩潰

功能PostData將數據發送到服務器,但是當我添加它的程序顯示:

不幸的是,程序停止工作

這裏是我的代碼:

package com.yahya.trackingsysem; 
import java.io.IOException; 
import java.util.ArrayList; 
import java.util.List; 

import org.apache.http.NameValuePair; 
import org.apache.http.client.ClientProtocolException; 
import org.apache.http.client.HttpClient; 
import org.apache.http.client.entity.UrlEncodedFormEntity; 
import org.apache.http.client.methods.HttpPost; 
import org.apache.http.impl.client.DefaultHttpClient; 
import org.apache.http.message.BasicNameValuePair; 

import android.app.Service; 
import android.content.Intent; 
import android.os.Handler; 
import android.os.IBinder; 
import android.widget.Toast; 

public class MyService extends Service { 

    Handler handler=new Handler(); 
    String info; 

    @Override 
    public void onCreate() { 
hello(); 
    } 

    void hello(){ 

     final Runnable r = new Runnable() 
     { 
      public void run() 
      { 
       Toast.makeText(getApplicationContext(), "Starting service", Toast.LENGTH_LONG).show(); 
      //////////////////// 
       postData(); 
      //////////////////// 
       handler.postDelayed(this, 10000); 
      } 
     }; 

     handler.postDelayed(r, 10000); 

    } 

    //********************* فنكشن الارسال 
    public void postData() { 
     // Create a new HttpClient and Post Header 
     HttpClient httpclient = new DefaultHttpClient(); 
     HttpPost httppost = new HttpPost("http://www.webserver.net/tracker.php"); 

     try { 
      // Add your data 
      List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(1); 
      nameValuePairs.add(new BasicNameValuePair("name", "Hi")); 
      httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 

      // Execute HTTP Post Request 
      httpclient.execute(httppost); 

     } catch (ClientProtocolException e) { 
      // TODO Auto-generated catch block 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
     } 
    } 
    //**************************************** 



    @Override 
    public IBinder onBind(Intent intent) { 
     // TODO Auto-generated method stub 
     return null; 
    } 


} 

和堆棧跟蹤:

10-27 06:11:59.094: E/AndroidRuntime(810): FATAL EXCEPTION: main 
10-27 06:11:59.094: E/AndroidRuntime(810): android.os.NetworkOnMainThreadException 
10-27 06:11:59.094: E/AndroidRuntime(810): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1133) 
10-27 06:11:59.094: E/AndroidRuntime(810): at java.net.InetAddress.lookupHostByName(InetAddress.java:385) 
10-27 06:11:59.094: E/AndroidRuntime(810): at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236) 
10-27 06:11:59.094: E/AndroidRuntime(810): at java.net.InetAddress.getAllByName(InetAddress.java:214) 
10-27 06:11:59.094: E/AndroidRuntime(810): at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:137) 
10-27 06:11:59.094: E/AndroidRuntime(810): at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164) 
10-27 06:11:59.094: E/AndroidRuntime(810): at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119) 
10-27 06:11:59.094: E/AndroidRuntime(810): at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360) 
10-27 06:11:59.094: E/AndroidRuntime(810): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555) 
10-27 06:11:59.094: E/AndroidRuntime(810): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487) 
10-27 06:11:59.094: E/AndroidRuntime(810): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465) 
10-27 06:11:59.094: E/AndroidRuntime(810): at com.yahya.trackingsysem.MyService.postData(MyService.java:60) 
10-27 06:11:59.094: E/AndroidRuntime(810): at com.yahya.trackingsysem.MyService$1.run(MyService.java:37) 
10-27 06:11:59.094: E/AndroidRuntime(810): at android.os.Handler.handleCallback(Handler.java:730) 
10-27 06:11:59.094: E/AndroidRuntime(810): at android.os.Handler.dispatchMessage(Handler.java:92) 
10-27 06:11:59.094: E/AndroidRuntime(810): at android.os.Looper.loop(Looper.java:137) 
10-27 06:11:59.094: E/AndroidRuntime(810): at android.app.ActivityThread.main(ActivityThread.java:5103) 
10-27 06:11:59.094: E/AndroidRuntime(810): at java.lang.reflect.Method.invokeNative(Native Method) 
10-27 06:11:59.094: E/AndroidRuntime(810): at java.lang.reflect.Method.invoke(Method.java:525) 
10-27 06:11:59.094: E/AndroidRuntime(810): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) 
10-27 06:11:59.094: E/AndroidRuntime(810): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
10-27 06:11:59.094: E/AndroidRuntime(810): at dalvik.system.NativeStart.main(Native Method) 
10-27 06:12:09.094: I/Process(810): Sending signal. PID: 810 SIG: 9 
10-27 06:12:24.545: D/AndroidRuntime(828): Shutting down VM 
10-27 06:12:24.545: W/dalvikvm(828): threadid=1: thread exiting with uncaught exception (group=0x41465700) 
10-27 06:12:24.595: E/AndroidRuntime(828): FATAL EXCEPTION: main 
10-27 06:12:24.595: E/AndroidRuntime(828): android.os.NetworkOnMainThreadException 
10-27 06:12:24.595: E/AndroidRuntime(828): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1133) 
10-27 06:12:24.595: E/AndroidRuntime(828): at java.net.InetAddress.lookupHostByName(InetAddress.java:385) 
10-27 06:12:24.595: E/AndroidRuntime(828): at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236) 
10-27 06:12:24.595: E/AndroidRuntime(828): at java.net.InetAddress.getAllByName(InetAddress.java:214) 
10-27 06:12:24.595: E/AndroidRuntime(828): at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:137) 
10-27 06:12:24.595: E/AndroidRuntime(828): at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164) 
10-27 06:12:24.595: E/AndroidRuntime(828): at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119) 
10-27 06:12:24.595: E/AndroidRuntime(828): at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360) 
10-27 06:12:24.595: E/AndroidRuntime(828): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555) 
10-27 06:12:24.595: E/AndroidRuntime(828): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487) 
10-27 06:12:24.595: E/AndroidRuntime(828): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465) 
10-27 06:12:24.595: E/AndroidRuntime(828): at com.yahya.trackingsysem.MyService.postData(MyService.java:60) 
10-27 06:12:24.595: E/AndroidRuntime(828): at com.yahya.trackingsysem.MyService$1.run(MyService.java:37) 
10-27 06:12:24.595: E/AndroidRuntime(828): at android.os.Handler.handleCallback(Handler.java:730) 
10-27 06:12:24.595: E/AndroidRuntime(828): at android.os.Handler.dispatchMessage(Handler.java:92) 
10-27 06:12:24.595: E/AndroidRuntime(828): at android.os.Looper.loop(Looper.java:137) 
10-27 06:12:24.595: E/AndroidRuntime(828): at android.app.ActivityThread.main(ActivityThread.java:5103) 
10-27 06:12:24.595: E/AndroidRuntime(828): at java.lang.reflect.Method.invokeNative(Native Method) 
10-27 06:12:24.595: E/AndroidRuntime(828): at java.lang.reflect.Method.invoke(Method.java:525) 
10-27 06:12:24.595: E/AndroidRuntime(828): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) 
10-27 06:12:24.595: E/AndroidRuntime(828): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
10-27 06:12:24.595: E/AndroidRuntime(828): at dalvik.system.NativeStart.main(Native Method) 

回答

3

你不能在線程中使用任何與UI相關的東西,在這裏你會在線程中顯示Toast消息,說明它爲什麼會崩潰。爲此,您必須使用處理程序來顯示吐司消息。

例..

Runnable runnable = new Runnable() { 
      public void run() { 
       Message msg = handler.obtainMessage(); 
       Bundle bundle = new Bundle();     
       bundle.putString("myKey", dateString); 
       msg.setData(bundle); 
       handler.sendMessage(msg); 
      } 
     }; 

private final Handler handler = new Handler() { 

     public void handleMessage(Message msg) { 

      String aResponse = msg.getData().getString("message"); 

      Toast.makeText(getApplicationContext(), ""+msg, Toast.LENGTH_LONG).show(); 

      } 
}; 

//寫上您的服務類的代碼。

if (android.os.Build.VERSION.SDK_INT > 9) { 
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); 
StrictMode.setThreadPolicy(policy); 
} 

// Mainfest

<uses-permission android:name="android.permission.INTERNET"/> 
+0

我不需要烤麪包,所以我刪除它埠問題仍然相同 – 2014-10-27 10:11:21

+0

你可以發佈錯誤日誌。 – samsad 2014-10-27 10:15:22

+0

我添加了logcat的錯誤 – 2014-10-27 10:19:45

3

這個問題可能與吐司有關。

刪除TOAST.show()。

+0

敬酒工作正常,直到我添加的功能踵()雖然我試圖消除烤麪包,但同樣的問題惜售 – 2014-10-27 09:34:59

+0

你能後的錯誤日誌。 – Akhil 2014-10-27 09:38:26

+0

你可以看到現在的logacat – 2014-10-27 10:17:19