1

私はこれが初めてで、Androidフォンでデータを実行すると、Androidフォンからコンピューターにデータを送信したいのですが、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);
    } 
}
4

5 に答える 5

3

これはあなたの問題を解決するのに役立つかもしれません

@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);
    }
于 2012-10-16T11:39:15.200 に答える
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()。お役に立てれば..

于 2012-10-16T11:43:47.577 に答える
2

これは私にとってはうまくいきます。

localhost 内の 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());
        }
  }
于 2012-10-16T15:21:22.887 に答える
1

このAsyncTask チュートリアル を試してください。ベスト プラクティスとして、Async メソッドを使用します。

簡単に 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ます。

于 2012-10-16T11:44:19.337 に答える
1

ネットワークまたはその他の時間のかかる操作を実行するためThreadsに、できれば常に使用してください。これAsyncTaskを読んでください。

PS Google で少し検索すると、何百もの結果が得られる可能性があります。

于 2012-10-16T11:36:10.143 に答える