簡體   English   中英

Android App因網絡異常關閉

[英]Android App closes unexpectedly due to network

我正在開發我的第一個Android應用程序。 到目前為止,我的筆記本電腦上運行着一個微型服務器,並從eclipse android kit(4.0.3)的示例中獲取了“ Skeleton App”示例。 我試圖拋出一個基本的Socket連接,以最終往返於Strings。 該應用程序曾被用來拋出IO權限被拒絕的異常,但是一旦我添加以下代碼:

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

該應用程序意外關閉。 如果該行不存在,則應用程序不會關閉,但是我當然會收到該異常。

這是我的代碼:

服務器:

public class net {
    public static void main(String [] args){
            ServerSocket ss;
            try {
                    ss = new ServerSocket(10017);
                    System.out.println("waiting");
                    Socket newSock = ss.accept();
                    System.out.println("success!");
            } catch (IOException e) {
                    System.out.println("FAIL");
                    e.printStackTrace();
            }
    }

}

客戶端(我添加並調用了buildNet()方法):

public class SkeletonActivity extends Activity {

static final private int BACK_ID = Menu.FIRST;
static final private int CLEAR_ID = Menu.FIRST + 1;
static private int port = 10013;
static private String address;
static Socket sock;

private EditText mEditor;

public SkeletonActivity() {
}

/** Called with the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Inflate our UI from its XML layout description.
    setContentView(R.layout.skeleton_activity);

    // Find the text editor view inside the layout, because we
    // want to do various programmatic things with it.
    mEditor = (EditText) findViewById(R.id.editor);

    // Hook up button presses to the appropriate event handler.
    ((Button) findViewById(R.id.back)).setOnClickListener(mBackListener);
    ((Button) findViewById(R.id.clear)).setOnClickListener(mClearListener);


    //
    //THIS IS WHERE BUILD NET IS CALLED. ITS RESULT IS RETURNED AND PRINTED TO THE
    //SCREEN OF THE APP
    //
    mEditor.setText(buildNet());
}

/**
 * Called when the activity is about to start interacting with the user.
 */
@Override
protected void onResume() {
    super.onResume();
}

public String buildNet(){
    FileWriter fstream= null;
    BufferedWriter out = null;

    try {
        address = "192.168.1.122";
        sock = new Socket(address, port);
        return "YES";
    } catch (UnknownHostException e) {
        return "UNKNOWN HOST";
    } catch (IOException e) {
        return e.getMessage();
    }
}

/**
 * Called when your activity's options menu needs to be created.
 */
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    super.onCreateOptionsMenu(menu);

    // We are going to create two menus. Note that we assign them
    // unique integer IDs, labels from our string resources, and
    // given them shortcuts.
    menu.add(0, BACK_ID, 0, R.string.back).setShortcut('0', 'b');
    menu.add(0, CLEAR_ID, 0, R.string.clear).setShortcut('1', 'c');

    return true;
}

/**
 * Called right before your activity's option menu is displayed.
 */
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    super.onPrepareOptionsMenu(menu);

    // Before showing the menu, we need to decide whether the clear
    // item is enabled depending on whether there is text to clear.
    menu.findItem(CLEAR_ID).setVisible(mEditor.getText().length() > 0);

    return true;
}

/**
 * Called when a menu item is selected.
 */
@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case BACK_ID:
        finish();
        return true;
    case CLEAR_ID:
        mEditor.setText("");
        return true;
    }

    return super.onOptionsItemSelected(item);
}

/**
 * A call-back for when the user presses the back button.
 */
OnClickListener mBackListener = new OnClickListener() {
    public void onClick(View v) {
        finish();
    }
};

/**
 * A call-back for when the user presses the clear button.
 */
OnClickListener mClearListener = new OnClickListener() {
    public void onClick(View v) {
        mEditor.setText("");
    }
};

}

MANIFEST.XML:

<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2007 The Android Open Source Project

     Licensed under the Apache License, Version 2.0 (the "License");
     you may not use this file except in compliance with the License.
     You may obtain a copy of the License at

          http://www.apache.org/licenses/LICENSE-2.0

     Unless required by applicable law or agreed to in writing, software
     distributed under the License is distributed on an "AS IS" BASIS,
     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     See the License for the specific language governing permissions and
     limitations under the License.
-->

<!-- This file describes the code in the SkeletonApp package, which is
     used by the system to determine how to start your application and
     integrate it with the rest of the system.  -->

<!-- Declare the contents of this Android application.  The namespace
     attribute brings in the Android platform namespace, and the package
     supplies a unique name for the application.  When writing your
     own application, the package name must be changed from "com.example.*"
     to come from a domain that you own or have control over. -->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.android.skeletonapp">

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

<uses-sdk android:targetSdkVersion="11"/>
<!-- This package contains an application...  The 'label' is the name
     to display to the user for the overall application, and provides
     a default label for all following components.  The syntax here is a
     reference to one of our string resources.-->
<application android:label="@string/skeleton_app">

    <!-- An Activity in the application - this is something the user
         can launch and interact with.  The "name" attribute is the
         name of the class within your package that implements this
         activity. -->
    <activity android:name="SkeletonActivity">

        <!-- An IntentFilter tells the system when it should use your
             activity.  This allows the user to get to your activity
             without someone having to explicitly know to launch your
             class "com.examplel.android.skeletonapp.SkeletonActivity". -->
        <intent-filter>
            <!-- The MAIN action describes a main entry point into an
                 activity, without any associated data. -->
            <action android:name="android.intent.action.MAIN" />

            <!-- This places this activity into the main app list. -->
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>

    </activity>

</application> </manifest>

您很可能會收到NetworkOnMainThreadException 您應該buildNet()調用放在AsyncTask ,並在onPostExecute ,返回結果(以您的情況為String ),並將其設置為TextView

這是使用AsyncTask 的文檔/指南

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM