2011-04-16 55 views
1

我有一个Android的应用程序,它有点像一个客户端服务器应用程序,我在某一点程序中,我开始打算将客户端连接到服务器的一个新的线程。当我开始一个新的线程时,我得到了强制关闭!

我的问题是,当我开始这个新的线程,我不知道会发生什么,但是当我试图用我的GUI(按一个按钮,带我到另一个活动)进行交互我得到强制关闭。

这是一个有点混乱的原因,因为我读不同网页上的新线程我开始无关,迪与我的GUI所以即使客户端试图连接或失败我应该能够 “玩”与我接口。

这里是我的代码:

public class screen1 extends Activity { 

private TextView clientState; 
private String serverIpAddress="10.0.2.2"; 
public static final int ClientPort = 8080; 
String message="Hello Server!"; 
int longitude; 
int latitude; 
private PrintWriter out=null; 
DBAdapter db; 
private Handler handler=new Handler(); 
Socket socket; 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.screen1); 
    clientState = (TextView) findViewById(R.id.client_Status); 

//这是为了让我到另一个活动和按钮按下时,它给了我FC

Button b = (Button)findViewById(R.id.mainMenu); 
    b.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View arg0) { 
     Intent i = new Intent(screen1.this, screen2.class); 
     startActivity(i); 
     } 
    }); 

//我在这里开始新的下面

Thread cThread=new Thread(new ClientThread()); 

    cThread.start(); 
db=new DBAdapter(this); 

} 

//这里螺纹形成这是我的客户端试图连接

public class ClientThread implements Runnable{ 


    public void run() 
    { 
     try 
     { 
      InetAddress serverAddr=InetAddress.getByName(serverIpAddress); 
      handler.post(new Runnable(){ 
       public void run(){ 
        clientState.setText(" try to connect!"); 
       } 
      }); 
      socket=new Socket(serverAddr,ClientPort); 

      //connected=true; 
     handler.post(new Runnable(){ 
       public void run(){ 
        clientState.setText("Connected!"); 
       } 
      }); 

     PrintWriter out=new PrintWriter(socket.getOutputStream(),true); 
     db.createDatabase(); 
     db.openDataBase(); 
      Cursor c=db.getAllData(); 

      if(c.moveToFirst()) 
      { 
       do{ 

        longitude=Integer.parseInt(c.getString(1)); 
        out.println(longitude); 
        latitude=Integer.parseInt(c.getString(2)); 
        out.println(latitude); 

       }while(c.moveToNext()); 

      } 




     } 
     catch(Exception e){ 
      handler.post(new Runnable(){ 
       public void run(){ 
        clientState.setText("Error"); 
        } 
      }); 

      e.printStackTrace(); 
     } 

    } 

} 

和的onStop()方法:

protected void onStop() { 

super.onStop(); 

    try { 

     out.close(); 
     socket.close(); 

    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 
} 

嗯,这是它,为进一步的细节我在这里explain.Thankü提前:)

4-16 03:51:25.045: ERROR/AndroidRuntime(242): Uncaught handler: thread main exiting due to uncaught exception 

04-16 03:51:25.074: ERROR/AndroidRuntime(242): java.lang.RuntimeException: Unable to stop activity {test.android/test.android.screen1}: java.lang.NullPointerException 

04-16 03:51:25.074: ERROR/AndroidRuntime(242):  at android.app.ActivityThread.performStopActivityInner(ActivityThread.java:3227) 

04-16 03:51:25.074: ERROR/AndroidRuntime(242):  at android.app.ActivityThread.handleStopActivity(ActivityThread.java:3272) 

04-16 03:51:25.074: ERROR/AndroidRuntime(242):  at android.app.ActivityThread.access$2500(ActivityThread.java:119) 

04-16 03:51:25.074: ERROR/AndroidRuntime(242):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1880) 

04-16 03:51:25.074: ERROR/AndroidRuntime(242):  at android.os.Handler.dispatchMessage(Handler.java:99) 

04-16 03:51:25.074: ERROR/AndroidRuntime(242):  at android.os.Looper.loop(Looper.java:123) 

04-16 03:51:25.074: ERROR/AndroidRuntime(242):  at android.app.ActivityThread.main(ActivityThread.java:4363) 

04-16 03:51:25.074: ERROR/AndroidRuntime(242):  at java.lang.reflect.Method.invokeNative(Native Method) 

04-16 03:51:25.074: ERROR/AndroidRuntime(242):  at java.lang.reflect.Method.invoke(Method.java:521) 

04-16 03:51:25.074: ERROR/AndroidRuntime(242):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860) 

04-16 03:51:25.074: ERROR/AndroidRuntime(242):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 

04-16 03:51:25.074: ERROR/AndroidRuntime(242):  at dalvik.system.NativeStart.main(Native Method) 

04-16 03:51:25.074: ERROR/AndroidRuntime(242): Caused by: java.lang.NullPointerException 

04-16 03:51:25.074: ERROR/AndroidRuntime(242):  at 
test.android.screen1.onStop(screen1.java:106) 

04-16 03:51:25.074: ERROR/AndroidRuntime(242):  at 
android.app.Instrumentation.callActivityOnStop(Instrumentation.java:1169) 

04-16 03:51:25.074: ERROR/AndroidRuntime(242):  at android.app.Activity.performStop(Activity.java:3797) 

04-16 03:51:25.074: ERROR/AndroidRuntime(242):  at android.app.ActivityThread.performStopActivityInner(ActivityThread.java:3224) 

04-16 03:51:25.074: ERROR/AndroidRuntime(242):  ... 11 more 

04-16 03:51:25.144: INFO/Process(51): Sending signal. PID: 242 SIG: 3 

04-16 03:51:25.154: INFO/dalvikvm(242): threadid=7: reacting to signal 3 

04-16 03:51:25.204: INFO/dalvikvm(242): Wrote stack trace to '/data/anr/traces.txt' 

04-16 03:51:41.604: INFO/Process(242): Sending signal. PID: 242 SIG: 9 

04-16 03:51:41.714: INFO/ActivityManager(51): Process test.android (pid 242) has died. 

04-16 03:51:41.753: INFO/WindowManager(51): WIN DEATH: Window{43e0eb10 test.android/test.android.screen2 paused=false} 

04-16 03:51:41.765: INFO/WindowManager(51): WIN DEATH: Window{43e068b0 test.android/test.android.screen1 paused=false} 

04-16 03:51:41.974: INFO/ActivityManager(51): Start proc test.android for activity test.android/.screen1: pid=249 uid=10030 gids={3003} 

04-16 03:51:42.433: DEBUG/ddm-heap(249): Got feature list request 

04-16 03:51:42.704: INFO/UsageStats(51): Unexpected resume of test.android while already resumed in test.android 

04-16 03:51:43.294: WARN/InputManagerService(51): Got RemoteException sending setActive(false) notification to pid 242 uid 10030 

04-16 03:51:43.513: INFO/ActivityManager(51): Displayed activity test.android/.screen1: 1736 ms (total 1736 ms) 

好吧,亲爱的朋友,我已经从我的代码的onStop删除()函数,和一切似乎工作!

保护无效的onStop(){

super.onStop(); 

    try { 

     out.close(); 


     socket.close(); 

    } catch (IOException e) { 

     e.printStackTrace(); 

    } 
} 

什么是错的: - ?s

+0

我发布logcat作为编辑我的答案,但我只得到一个错误 - 附加线程失败 – adrian 2011-04-16 15:34:26

+0

我已经做到了...我有17个特权,我投了几个问题 – adrian 2011-04-16 15:43:33

+1

这看起来不像“逼近”错误。你需要看的东西有错误时抛出的忙 – Nanne 2011-04-16 15:46:57

回答

2

我认为在你的线程onStop方法变量outnull。您声明变量,但你null初始化它,不会初始化另一个值给它。

你做

PrintWriter out=new PrintWriter(socket.getOutputStream(),true); 
在你的线程的 run方法

,但这个变量有不同的范围比你onStop方法中使用的变量。这就是为什么你会得到一个NullPointerException

+0

private PrintWriter out = null;但在此之后PrintWriter out = new PrintWriter(套接字。的getOutputStream(),TRUE); – adrian 2011-04-16 16:03:04

相关问题