android.os.NetworkOnMainThreadException - 对于按钮点击

android.os.NetworkOnMainThreadException - For Button Click

我有 android.os.NetworkOnMainThreadException 这个错误。我读过一些线程,为了避免这种情况,我们应该执行 AsyncTask。但是,我不知道如何为 ButtonClick 事件执行此操作。下面是我的代码...

MainActivity.java:

public class MainActivity extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button test = (Button) findViewById(R.id.testbutton);

        test.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                try {
                    DynamoDBClient dbClient = new DynamoDBClient();

                    dbClient.DynamoDB();
                    dbClient.createTable();

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

你们能给我一个关于如何将 AsyncTask 用于 ButtonClick 事件的建议吗?我尝试过但失败了。谢谢。

正确的方法是:

public class DoYoreWork extends AsyncTask<String, Void, String> {
    @Override
    protected String doInBackground(String... params) {

        try {
            DynamoDBClient dbClient = new DynamoDBClient();
            dbClient.DynamoDB();
            dbClient.createTable();

        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;

    }

    protected void onPostExecute(String page) {
        // onPostExecute
    }
}

MainActivity.java

public class MainActivity extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button test = (Button) findViewById(R.id.testbutton);
        test.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                DoYoreWork obj = new DoYoreWork();
                obj.execute();
            }
        });
    }
}

您正在主线程上进行网络操作,只需要一个线程并在该线程的 运行 方法中编写 onClick() 代码,然后在 onClick( 中启动该线程,如下所示

Thread t=new Thread(){
    public void run(){
        try
        {
            DynamoDBClient dbClient = new DynamoDBClient();

            dbClient.DynamoDB();
            dbClient.createTable();


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

并在 OnClick()

test.setOnClickListener(new View.OnClickListener()
    {
        @Override
        public void onClick (View view)
        {
           t.start();
        }
      }

希望对您有所帮助。