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

时间:2015-06-13 05:06:24

标签: java android networkonmainthread

我有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事件的建议吗?我试过但失败了。谢谢。

2 个答案:

答案 0 :(得分:2)

您正在主线程上进行网络操作,只需获取一个线程并在该线程的run方法中编写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();
        }
      }

希望这会对你有所帮助。

答案 1 :(得分:0)

这是正确的方法:

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();
            }
        });
    }
}