1

我是新手,如果我在我的安卓手机上运行它,我想将数据从我的安卓手机发送到我的电脑,它说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

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 回答
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 回答
2

这对我有用。

请尝试使用 localhost 中的 IP 地址

安卓权限:

<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

始终使用Threads,最好AsyncTask是执行网络或任何其他需要时间的操作。读这个

PS 在 Google 上进行一点搜索可以为您提供数百个结果。

于 2012-10-16T11:36:10.143 回答
1

试试这个AsyncTask 教程。最佳实践使用异步方法。

简单地在 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 回答