代码之家  ›  专栏  ›  技术社区  ›  Nir Tzin

调用Httppost时无法启动activity ComponentInfo

  •  0
  • Nir Tzin  · 技术社区  · 8 年前

    我有一个函数,需要通过post请求将令牌和mac号写入我的DB。 我从onCreate调用函数,当它调用时,我得到: 无法启动活动组件信息

    这是我的代码:

    public void writeTokenAndMacToDB() {
        // Create a new HttpClient and Post Header
        HttpClient httpclient = new DefaultHttpClient();
        HttpPost httppost = new HttpPost("http://example.com/w2a/process/updatetoken.php");
    
        try {
            // Add your data
            List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(4);
    
            nameValuePairs.add(new BasicNameValuePair("appid", appID));
            nameValuePairs.add(new BasicNameValuePair("token", userToken));
            nameValuePairs.add(new BasicNameValuePair("device", "android"));
            nameValuePairs.add(new BasicNameValuePair("mac", deviceMac));
    
            httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
    
            // Execute HTTP Post Request
            HttpResponse response = httpclient.execute(httppost);
    
        } catch (ClientProtocolException e) {
            // TODO Auto-generated catch block
        } catch (IOException e) {
            // TODO Auto-generated catch block
        }
    }
    

    我很乐意得到一些建议

    我对安卓相当陌生,所以这是我的最爱:

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="web2application.master.com.myapplication">
    
        <!-- GCM connects to Google Services. -->
        <uses-permission android:name="android.permission.INTERNET" />
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
        <!-- GCM requires a Google account. -->
        <uses-permission android:name="android.permission.GET_ACCOUNTS" />
        <uses-permission android:name="android.permission.WAKE_LOCK" />
        <permission android:name="web2application.master.com.myapplication.permission.C2D_MESSAGE" android:protectionLevel="signature" />
        <uses-permission android:name="nirtzin.com.pushbots.permission.C2D_MESSAGE" />
        <!-- This app has permission to register and receive dataf message. -->
        <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
        <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
        <uses-permission android:name="android.permission.VIBRATE" />
    
    
    
        <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:roundIcon="@mipmap/ic_launcher_round"
            android:supportsRtl="true"
            android:theme="@style/AppTheme">
            <activity
                android:name=".MainActivity"
    
                android:theme="@style/AppTheme.NoActionBar">
    
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
    
        </application>
    
    </manifest>
    

    完整logcat错误:

    E/AndroidRuntime: FATAL EXCEPTION: main
                                                                                              Process: web2application.master.com.myapplication, PID: 14054
                                                                                              java.lang.RuntimeException: Unable to start activity ComponentInfo{web2application.master.com.myapplication/web2application.master.com.myapplication.MainActivity}: android.os.NetworkOnMainThreadException
                                                                                                  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2326)
                                                                                                  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)
                                                                                                  at android.app.ActivityThread.access$800(ActivityThread.java:147)
                                                                                                  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1281)
                                                                                                  at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                                                  at android.os.Looper.loop(Looper.java:135)
                                                                                                  at android.app.ActivityThread.main(ActivityThread.java:5264)
                                                                                                  at java.lang.reflect.Method.invoke(Native Method)
                                                                                                  at java.lang.reflect.Method.invoke(Method.java:372)
                                                                                                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:900)
                                                                                                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:695)
                                                                                               Caused by: android.os.NetworkOnMainThreadException
                                                                                                  at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1147)
                                                                                                  at java.net.InetAddress.lookupHostByName(InetAddress.java:418)
                                                                                                  at java.net.InetAddress.getAllByNameImpl(InetAddress.java:252)
                                                                                                  at java.net.InetAddress.getAllByName(InetAddress.java:215)
                                                                                                  at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:137)
                                                                                                  at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
                                                                                                  at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
                                                                                                  at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
                                                                                                  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
                                                                                                  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
                                                                                                  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
                                                                                                  at web2application.master.com.myapplication.MainActivity.writeTokenAndMacToDB(MainActivity.java:964)
                                                                                                  at web2application.master.com.myapplication.MainActivity.onCreate(MainActivity.java:300)
                                                                                                  at android.app.Activity.performCreate(Activity.java:5975)
                                                                                                  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
                                                                                                  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2269)
                                                                                                  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387) 
                                                                                                  at android.app.ActivityThread.access$800(ActivityThread.java:147) 
                                                                                                  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1281) 
                                                                                                  at android.os.Handler.dispatchMessage(Handler.java:102) 
                                                                                                  at android.os.Looper.loop(Looper.java:135) 
                                                                                                  at android.app.ActivityThread.main(ActivityThread.java:5264) 
                                                                                                  at java.lang.reflect.Method.invoke(Native Method) 
                                                                                                  at java.lang.reflect.Method.invoke(Method.java:372) 
                                                                                                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:900) 
                                                                                                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:695)
    

    Â

    1 回复  |  直到 8 年前
        1
  •  0
  •   Munir    8 年前

    class PerformTask extends AsyncTask<Void,Void,Void>{
    
            @Override
            protected Void doInBackground(Void... voids) {
                writeTokenAndMacToDB();
                return null;
            }
        }
    

    并执行如下操作

    new PerformTask().execute();
    

    您无法在主线程上执行此类操作,以获取更多有关此链接的信息 http://developer.android.com/reference/android/os/NetworkOnMainThreadException.html