2013-02-26 2 views
0

Я пытаюсь создать сокет как объект приложения. Вот код на активность в:Исключение при использовании объекта приложения?

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    context = getApplicationContext(); 
    setContentView(R.layout.activity_connect); 
    app = (MyApplication) getApplication(); 
    connectButton = (ImageButton) findViewById(R.id.connect_button); 
    connectButton.setOnClickListener(connectListener); 
    //app.stablishConnection(); 

} 

private OnClickListener connectListener = new OnClickListener() { 

    @Override 
    public void onClick(View v) { 

     app.stablishConnection(); 
     Intent intent = new Intent(context, ShowDetails.class); 
     startActivity(intent); 
    } 
}; 

А вот класс Application Код

private Socket socket; 
Context context; 

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    super.onConfigurationChanged(newConfig); 
} 

@Override 
public void onCreate() { 
    super.onCreate(); 
    context = getApplicationContext(); 
} 

@Override 
public void onLowMemory() { 
    super.onLowMemory(); 
} 

@Override 
public void onTerminate() { 
    super.onTerminate(); 
} 

public void stablishConnection(){ 
    try { InetAddress serverAddr; 
     serverAddr = InetAddress.getByName("10.10.10.10"); 
     socket = new Socket(serverAddr, 5000); 
    } catch (UnknownHostException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

} 

Я хочу, чтобы сокет не будет уничтожен, пока приложение не будет закрыто, и я хочу создать сокет, как только пользователь нажмите кнопку.

Система показывает мне исключение androidblockguardpolicy, когда активность вызывает app.stablishConnection(). Я также попытался вызвать этот метод в onCreate (вы можете видеть, что он прокомментировал), и в этом случае он показывает и не удается запустить исключение компонентаInfo, когда приложение пытается создать сокет socket = new Socket(serverAddr, 5000); в классе приложения.

Как это исправить?

ответ

1

Не выполняйте сетевые операции в потоке основного/пользовательского интерфейса приложения. Существует много учебных пособий по созданию служб или использование фоновой темы/асинхронной задачи для выполнения любого сетевого ввода-вывода, который вам нужно выполнить.

+0

Должен ли я создать поток в классе приложения? Я попробую, но я думаю, что это только объясняет одно из исключений. Есть ли какая-нибудь проблема при вызове 'app.stablishConnection()' из OnClickListener? – user2071976

+0

Я не думаю, что задача async является хорошим примером долговременных сетевых операций. «Сервис» или «HandlerThread» - лучший выбор, на мой взгляд. – tomrozb

+0

@toro, я не знаю, что этот случай использует людей, но вы правы, что он всегда зависит от того, что он делает. –

Смежные вопросы