2013-03-02 44 views
0

我看到了一个在线示例,说明如何在PC上的android应用程序和java服务器之间实现套接字连接。该应用程序在模拟器上运行完美(运行2.3.3),但强制在我的android智能手机上关闭。如何实现套接字连接的asyncTask

经过一番研究,我得出结论,解决方案是实施一个asynctask方法。但是我遇到问题很难实现它。我看到很多解释,但他们并没有帮我解决我的问题。这是我正在使用的示例代码,我将使用此代码作为我开发的其他应用程序的参考模板。

我知道这个问题已被问很多(很多!),但直到现在我还没有设法使这项工作。 所以任何人可以帮助我用下面的代码:

package com.exercise.AndroidClient; 

import java.io.DataInputStream; 
import java.io.DataOutputStream; 
import java.io.IOException; 
import java.net.Socket; 
import java.net.UnknownHostException; 

import android.app.Activity; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.TextView; 

public class AndroidClient extends Activity { 

EditText textOut; 
TextView textIn; 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    textOut = (EditText)findViewById(R.id.textout); 
    Button buttonSend = (Button)findViewById(R.id.send); 
    textIn = (TextView)findViewById(R.id.textin); 
    buttonSend.setOnClickListener(buttonSendOnClickListener); 
} 

Button.OnClickListener buttonSendOnClickListener 
= new Button.OnClickListener(){ 

@Override 
public void onClick(View arg0) { 
// TODO Auto-generated method stub 
Socket socket = null; 
DataOutputStream dataOutputStream = null; 
DataInputStream dataInputStream = null; 

try { 
    socket = new Socket("192.168.1.101", 8888); 
    dataOutputStream = new DataOutputStream(socket.getOutputStream()); 
    dataInputStream = new DataInputStream(socket.getInputStream()); 
    dataOutputStream.writeUTF(textOut.getText().toString()); 
    textIn.setText(dataInputStream.readUTF()); 
} catch (UnknownHostException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} catch (IOException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 
finally{ 
    if (socket != null){ 
    try { 
    socket.close(); 
    } catch (IOException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
    } 
    } 

    if (dataOutputStream != null){ 
    try { 
    dataOutputStream.close(); 
    } catch (IOException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
    } 
    } 

    if (dataInputStream != null){ 
    try { 
    dataInputStream.close(); 
    } catch (IOException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
    } 
    } 
} 
; 
}}; 
} 

logcat的

03-03 21:35:59.643: E/Trace(3472): error opening trace file: No such file or directory (2) 
03-03 21:36:01.073: D/gralloc_goldfish(3472): Emulator without GPU emulation detected. 
03-03 21:36:12.045: D/AndroidRuntime(3472): Shutting down VM 
03-03 21:36:12.045: W/dalvikvm(3472): threadid=1: thread exiting with uncaught exception (group=0x40a13300) 
03-03 21:36:12.103: E/AndroidRuntime(3472): FATAL EXCEPTION: main 
03-03 21:36:12.103: E/AndroidRuntime(3472): android.os.NetworkOnMainThreadException 
03-03 21:36:12.103: E/AndroidRuntime(3472):  at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1117) 
03-03 21:36:12.103: E/AndroidRuntime(3472):  at libcore.io.BlockGuardOs.recvfrom(BlockGuardOs.java:163) 
03-03 21:36:12.103: E/AndroidRuntime(3472):  at libcore.io.IoBridge.recvfrom(IoBridge.java:513) 
03-03 21:36:12.103: E/AndroidRuntime(3472):  at java.net.PlainSocketImpl.read(PlainSocketImpl.java:488) 
03-03 21:36:12.103: E/AndroidRuntime(3472):  at java.net.PlainSocketImpl.access$000(PlainSocketImpl.java:46) 
03-03 21:36:12.103: E/AndroidRuntime(3472):  at java.net.PlainSocketImpl$PlainSocketInputStream.read(PlainSocketImpl.java:240) 
03-03 21:36:12.103: E/AndroidRuntime(3472):  at libcore.io.Streams.readFully(Streams.java:81) 
03-03 21:36:12.103: E/AndroidRuntime(3472):  at java.io.DataInputStream.readShort(DataInputStream.java:169) 
03-03 21:36:12.103: E/AndroidRuntime(3472):  at java.io.DataInputStream.readUnsignedShort(DataInputStream.java:182) 
03-03 21:36:12.103: E/AndroidRuntime(3472):  at java.io.DataInputStream.readUTF(DataInputStream.java:186) 
03-03 21:36:12.103: E/AndroidRuntime(3472):  at com.exercise.AndroidClient.AndroidClient$LongOperation.onPostExecute(AndroidClient.java:80) 
03-03 21:36:12.103: E/AndroidRuntime(3472):  at com.exercise.AndroidClient.AndroidClient$LongOperation.onPostExecute(AndroidClient.java:1) 
03-03 21:36:12.103: E/AndroidRuntime(3472):  at android.os.AsyncTask.finish(AsyncTask.java:631) 
03-03 21:36:12.103: E/AndroidRuntime(3472):  at android.os.AsyncTask.access$600(AsyncTask.java:177) 
03-03 21:36:12.103: E/AndroidRuntime(3472):  at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644) 
03-03 21:36:12.103: E/AndroidRuntime(3472):  at android.os.Handler.dispatchMessage(Handler.java:99) 
03-03 21:36:12.103: E/AndroidRuntime(3472):  at android.os.Looper.loop(Looper.java:137) 
03-03 21:36:12.103: E/AndroidRuntime(3472):  at android.app.ActivityThread.main(ActivityThread.java:4745) 
03-03 21:36:12.103: E/AndroidRuntime(3472):  at java.lang.reflect.Method.invokeNative(Native Method) 
03-03 21:36:12.103: E/AndroidRuntime(3472):  at java.lang.reflect.Method.invoke(Method.java:511) 
03-03 21:36:12.103: E/AndroidRuntime(3472):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
03-03 21:36:12.103: E/AndroidRuntime(3472):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
03-03 21:36:12.103: E/AndroidRuntime(3472):  at dalvik.system.NativeStart.main(Native Method) 
03-03 21:36:14.722: I/Process(3472): Sending signal. PID: 3472 SIG: 9 
+0

* *您的问题是什么* – 2013-03-02 20:24:39

+0

使用Apache Mina库。这跟随异步方法与听众 – 2013-03-02 21:14:57

回答

1

我假定活动具有正确的权限打开一个套接字。

我想,运行代码的问题是,您正在UI线程上进行互联网连接。这非常令人沮丧,有时只是导致应用程序停止。

你是对的,你需要用你的代码创建一个AsyncTask并触发它。有两个地方需要了解:How to execute web request in its own thread?Is there an accepted best-practice on making asynchronous HTTP requests in Android?

+0

让我检查我是否得到这个权利。在doInBackground中,我执行套接字连接,例如:socket = new Socket(“192.168.1.101”,8888); ... 和onPostExecute我使用dataOutputStream = new DataOutputStream(socket.getOutputStream()); ...? – nick28 2013-03-02 21:30:58

+1

做所有在doInBackground的工作。然后使用onPostExecute(a)执行任何UI(屏幕)操作,(b)更新您从查询更新的任何数据列表,以及(c)将任何消息发送到其他需要了解信息或连接的活动或服务完成。 – 2013-03-03 14:16:02

+0

所以我做了doInBackground中的套接字连接并在PostExecute中发送和接收字符串。但现在当我按下发送按钮时,字符串被发送,但随后app关闭! – nick28 2013-03-03 19:11:20

0

正如Neil之前所说的:您必须使用doInBackgroud中的套接字完成所有工作。还接收字符串。

+0

我试了一下,得到了同样的结果,手机中的字符串被发送到PC服务器,但接下来应用程序的力量在收到来自PC的字符串之前关闭。 – nick28 2013-03-03 19:44:54

+0

现在有什么样的例外? – greenapps 2013-03-03 21:12:31

+0

你还有那个NetworkOnMainThreadExeption吗?如果是这样,那么不是所有的网络代码都在DoOnBackground中。或者你用.get()而不是仅仅执行.execute()来实例化你的asynctask。 – greenapps 2013-03-03 21:53:04

0

@ nick28:你在45行有一个未捕获的异常,你的行45是什么? 尝试下列代码,然后再初始化您的控件,希望您的应用程序不会关闭:

if (android.os.Build.VERSION.SDK_INT > 9) { 
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); 
StrictMode.setThreadPolicy(policy); 
}