通过服务发布数据会导致应用程序崩溃。

12 浏览
0 Comments

通过服务发布数据会导致应用程序崩溃。

我正在尝试通过后台服务向web服务器提交数据。\n函数PostData将数据发送到服务器,但当我添加它时,程序显示:\n

\n不幸的是,程序停止工作\n

\n这是我的代码:\n

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() {
        // 创建一个新的HttpClient和Post Header
        HttpClient httpclient = new DefaultHttpClient();
        HttpPost httppost = new HttpPost("http://www.webserver.net/tracker.php");
        try {
            // 添加数据
            List nameValuePairs = new ArrayList(1);
            nameValuePairs.add(new BasicNameValuePair("name", "Hi"));
            httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
            // 执行HTTP Post请求
          httpclient.execute(httppost);
        } catch (ClientProtocolException e) {
            // 处理异常
        } catch (IOException e) {
            // 处理异常
        }
    } 
    //****************************************
    @Override
    public IBinder onBind(Intent intent) {
        // TODO Auto-generated method stub
        return null;
    }
}

\n以及stack trace:\n

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)

0
0 Comments

问题可能与Toast有关。

删除TOAST.show()。

在添加PostDate()函数之前,Toast正常工作,尝试删除Toast但问题仍然存在。

你可以查看logcat现在。

0
0 Comments

问题:通过服务发送数据会导致应用程序崩溃。

出现原因:在线程中不能使用任何与UI相关的内容,而在这里,在一个线程中显示Toast消息,导致应用程序崩溃。解决方法是使用Handler来显示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);
}

在Manifest文件中添加以下权限:


我不需要Toast消息,所以我删除了它,但问题仍然存在。嗨...在我的上述帖子中添加了两行代码,请检查一下。我希望它能起作用。

并且,请查看此链接:stackoverflow.com/questions/16439587

现在不再崩溃了,这段小代码修复了问题,虽然我不知道为什么,但感谢你,现在我可以继续查看下一步,看看为什么服务器没有接收到字符串。

0