2015-08-31 5 views
0

Я работаю над проектом сетевой коммуникации в android, но моя доза приложения не работает! после некоторой отладки я узнаю, что каждый сетевой запрос имеет нулевой ответ от системы.Сетевые запросы возвращают null - Android

я пытался так много способов, таких как: 1) жесткий перезагрузить телефон 2) добавление всех сетевых разрешений для файла манифеста

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

3), используя локальную сеть (мой телефон в качестве сервера) 4) позволяет всем приложениям подключаться к сети: настройка> сетевые приложения> ...

но! ничего не произошло ...

это моя похожа ссылка проблемы, но нет ответа в этой теме: can't connect to internet in ONLY in my android app. Each method to connect internet returns null

сеть работает на моем телефоне, потому что некоторые приложения, такие как телеграмма и хром работают хорошо!

и здесь есть что-то смешное, когда я копирую и прохожу этот код в простой проект java, а не проект андроида, он работает хорошо!

потому что я хотел выяснить, в чем проблема, я просто скопирую 3 простых строки кодов в простой проект андроида, но все равно ничего не произошло!

файл манифеста:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.example.dltests" 
    android:versionCode="1" 
    android:versionName="1.0" > 

    <uses-sdk 
     android:minSdkVersion="11" 
     android:targetSdkVersion="17" /> 

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

    <application 
     android:allowBackup="true" 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" > 
     <activity 
      android:name=".MainActivity" 
      android:label="@string/title_activity_main" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
    </application> 

</manifest> 

расположение файла

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context="${relativePackage}.${activityClass}" > 

    <TextView 
     android:id="@+id/hello" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="@string/hello_world" /> 

</RelativeLayout> 

исходный файл

package com.example.dltests; 

import java.net.HttpURLConnection; 
import java.net.URL; 

import android.app.Activity; 
import android.os.Bundle; 
import android.widget.TextView; 

public class MainActivity extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     TextView mTextView = (TextView) findViewById(R.id.hello); 

     try 
     { 
      URL mUrl = new URL("http://192.168.1.53:8080/some.zip"); 
      HttpURLConnection mHttpURLConnection = (HttpURLConnection) mUrl.openConnection(); 
      mTextView.setText(mHttpURLConnection.getContentLength()); 

     } 
     catch (Exception e) 
     { 
      mTextView.setText("ERROR: " + e.getMessage()); 
     } 

    } 
} 

и результат: ОШИБКА: пустой

+0

Запишите исключение, чтобы увидеть NetworkOnMainThreadException, а затем подумайте, что означает название исключения. – laalto

+0

Вы уверены, что ваш телефон может использовать этот URL? Что произойдет, если вы используете веб-браузер телефона, чтобы перейти на страницу http://192.168.1.53:8080/HiSuiteSetup_2.3.55.1.zip? – elevine

+0

@laalto: да точно! это ошибка: android.os.NetworkOnMainThreadException – user3276720

ответ

0

Android б вы от сети в потоке пользовательского интерфейса. Что вам нужно сделать, это создать отдельный поток для создания сети для вас. Затем вам нужно либо приемник, либо обработчик для публикации/обновления пользовательского интерфейса с данными.

1 - Создайте новый класс:

import android.os.Handler; 
import android.os.Message; 

public class GetData extends Thread 
{ 

    // Holds url that data is stored on 
    private URL url 

    // Sets the url value 
    public GetData(URL newUrl) 
    { 
     url = newUrl; 
    } 

    // Runs when the thread is launched 
    public void run() 
    { 
     // Opens connection 
     HttpURLConnection con = (HttpURLConnection) url.openConnection(); 

     // Sends back to UI using a Message 
     Message msg = MainActivity.MainActivityInterface.obtainMessage(MainActivity.getAndUpdate); 
     msg.obj = con.getContentLength(); // Adds the data 
     HomeScreen.homeScreenInterface.sendMessage(msg); 
    } 
} 

2 - Создание обработчика в деятельности так UI может быть обновлена, а также запуск рабочего потока

import java.net.HttpURLConnection; 
import java.net.URL; 

import android.app.Activity; 
import android.os.Bundle; 
import android.widget.TextView; 

import android.os.Handler; 
import android.os.Message; 

public class MainActivity extends Activity { 

    // Holds activity instance 
    public static MainActivity currentInstance; 

    // Variable that allows us to separate messages for handler 
    public static final getAndUpdate = 0; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     currentInstance = this; 
     TextView mTextView = (TextView) findViewById(R.id.hello); 

     try 
     { 
      URL mUrl = new URL("http://192.168.1.53:8080/some.zip"); 

      // Spawns worker thread 
      GetData gd = new GetData(mUrl); 
      gd.start(); 
     } 
     catch (Exception e) 
     { 
      mTextView.setText("ERROR: " + e.getMessage()); 
     } 
    } 

    // Deals with service responses 
    public static Handler MainActivityInterface = new Handler() 
    { 
     @Override 
     public void handleMessage(Message msg) 
     { 
      switch(msg.what) 
      { 
       case getAndUpdate: 
        currentInstance.mTextView.setText((String) msg.obj); // Gets message object and updates UI 
       break; 
      } 
     } 
    } 
} 

Я надеюсь, что это помогает. Обратите внимание, что я не тестировал его, так как я очень далек от моего компьютера для кодирования!