2012-10-16 30 views
1

我在這個 我想從我的Android手機將數據發送到我的電腦 如果我在我的Android手機上運行它,它說:android.os.NetworkOnMainThreadException 有人可以幫助我的新?android.os.NetworkOnMainThreadException可一些幫助我

public void OnClick1(View v) { 

    try{ 
     Socket s=new Socket("localhost",4445); 

     DataOutputStream dout =new DataOutputStream(s.getOutputStream()); 

     dout.writeUTF("hello"); 
     dout.flush(); 

     dout.close(); 
     s.close(); 

    } catch (Exception e){ 
     System.out.println(e); 
    } 
} 
+2

發佈您的代碼。 – eightx2

+2

轉到www.google.com並在那裏粘貼您的查詢。你的查詢有很多結果。 –

+1

@SamSam:您可能不會在主線程上執行網絡操作,因爲它會阻塞用戶界面。爲它使用一個單獨的線程。最簡單的方法是使用'AsyncTask'類。 – Codo

回答

1

始終使用Threads,優選AsyncTask,以執行網絡或任何其他時間服用操作。閱讀this

P.S.在Google上進行一些搜索可以爲您提供數百項結果。

+0

我不知道如何使用AsyncTask 你能幫助我嗎? – SamSam

+0

轉到www.google.com並搜索如何使用AsyncTask。 –

2

可能這可以幫助您解決您的問題

@Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main);  
     StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); 
     StrictMode.setThreadPolicy(policy); 
    } 
+0

nop,但感謝您試圖幫助 – SamSam

3

NetworkOnMainThreadException:當應用程序試圖在其主線程進行網絡操作時引發的異常。

如下您可以創建一個AsyncTask類:

private class MyAsyncTask extends AsyncTask<Void, Void, Void> 
{ 

    @Override 
    protected void onPostExecute(Void result) { 
     //Task you want to do on UIThread after completing Network operation 
     //onPostExecute is called after doInBackground finishes its task. 
    } 

    @Override 
    protected Void doInBackground(Void... params) { 
     //Do your network operation here 
     return null; 
    } 
} 

另外,不要忘記調用doInBackground()功能,可以通過使用MyAsyncTask.execute()輕鬆調用。 希望這會有所幫助..

+0

所以我必須把 套接字s =新的套接字(「本地主機」,4445); ... in to de doinBackground部分? – SamSam

+0

你能幫我嗎我是新手 – SamSam

+0

是的..你應該在doInBackground()中完成你所有的網絡任務..你可以參考下面TechEnd的答案中提到的鏈接,瞭解使用AsyncTask的一個很好的教程.. –

1

試試這個AsyncTask tutorial。爲了最佳實踐使用異步方法。

簡單試試這個代碼onCreate方法

StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().detectAll().penaltyLog().penaltyDeath().build()); 
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().detectAll().penaltyLog().penaltyDeath().build()); 

但有時也很難記住要在開發過程中應用程序中的所有正確的事情。這就是StrictMode進來。它允許在您的應用程序中設置策略,以避免做不正確的事情。例如,如果以下設置違反了某些Android策略,則會導致應用程序崩潰。 StrictMode只能在開發過程中使用,而不能在實時應用程序中使用。

最好避免使用StrictMode,去用AsyncTask的方法。

+0

nop的教程沒有幫助我,但感謝試圖幫助 – SamSam

+0

該教程將告訴你,如何異步在android中工作。 –

2

這個工作適合我。

請儘量到IP地址的本地主機的內部

的Android權限:

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

RetrieveFeedTask代碼:

class RetreiveFeedTask extends AsyncTask<String, Void, Void> { 

    private Exception exception; 

    protected Void doInBackground(String... datas) { 
    try { 
     Socket s = new Socket("10.10.10.46", 8888); 

     DataOutputStream dout = new DataOutputStream(s.getOutputStream()); 
     for (String string : datas) { 
      dout.writeUTF(string); 
     } 

     dout.flush(); 
     dout.close(); 
     s.close(); 
    } catch (Exception e) { 
     this.exception = e; 
    } 
    return null; 
    } 

    protected void onPostExecute(Void void1) { 
    // do nothing; 
    } 

    public RetreiveFeedTask() { 
    } 

    public Exception getException() { 
    return exception; 
    } 

} 


@Override 
public void onClick(View v) { 
    switch (v.getId()) { 
    case R.id.btn: 

     RetreiveFeedTask feedTask = new RetreiveFeedTask(); 
     feedTask.execute(new String[] { "hello", "hello" }); 
     if (feedTask.getException() != null) { 
      Log.d(TAG, feedTask.getException().toString()); 
     } 
    }