Java ASyncTask故障-执行doInBackground时出错

Java ASyncTask故障-执行doInBackground时出错,java,android,mysql,Java,Android,Mysql,我在执行异步任务时遇到了一些问题。我试图访问一个php文件,该文件应该连接MySQL数据库并检查用户名是否正确 我得到的错误如下: 12-01 14:51:25.815: W/dalvikvm(3216): threadid=11: thread exiting with uncaught exception (group=0x40a13300) 12-01 14:51:25.927: E/AndroidRuntime(3216): FATAL EXCEPTION: AsyncTask #1 1

我在执行异步任务时遇到了一些问题。我试图访问一个php文件,该文件应该连接MySQL数据库并检查用户名是否正确

我得到的错误如下:

12-01 14:51:25.815: W/dalvikvm(3216): threadid=11: thread exiting with uncaught exception (group=0x40a13300)
12-01 14:51:25.927: E/AndroidRuntime(3216): FATAL EXCEPTION: AsyncTask #1
12-01 14:51:25.927: E/AndroidRuntime(3216): java.lang.RuntimeException: An error occured while executing doInBackground()
12-01 14:51:25.927: E/AndroidRuntime(3216):     at android.os.AsyncTask$3.done(AsyncTask.java:299)
12-01 14:51:25.927: E/AndroidRuntime(3216):     at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
12-01 14:51:25.927: E/AndroidRuntime(3216):     at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
12-01 14:51:25.927: E/AndroidRuntime(3216):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
12-01 14:51:25.927: E/AndroidRuntime(3216):     at java.util.concurrent.FutureTask.run(FutureTask.java:137)
12-01 14:51:25.927: E/AndroidRuntime(3216):     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
12-01 14:51:25.927: E/AndroidRuntime(3216):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
12-01 14:51:25.927: E/AndroidRuntime(3216):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
12-01 14:51:25.927: E/AndroidRuntime(3216):     at java.lang.Thread.run(Thread.java:856)
12-01 14:51:25.927: E/AndroidRuntime(3216): Caused by: android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
12-01 14:51:25.927: E/AndroidRuntime(3216):     at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:4607)
12-01 14:51:25.927: E/AndroidRuntime(3216):     at android.view.ViewRootImpl.requestLayout(ViewRootImpl.java:835)
12-01 14:51:25.927: E/AndroidRuntime(3216):     at android.view.View.requestLayout(View.java:15129)
12-01 14:51:25.927: E/AndroidRuntime(3216):     at android.view.View.requestLayout(View.java:15129)
12-01 14:51:25.927: E/AndroidRuntime(3216):     at android.view.View.requestLayout(View.java:15129)
12-01 14:51:25.927: E/AndroidRuntime(3216):     at android.view.View.requestLayout(View.java:15129)
12-01 14:51:25.927: E/AndroidRuntime(3216):     at android.widget.RelativeLayout.requestLayout(RelativeLayout.java:292)
12-01 14:51:25.927: E/AndroidRuntime(3216):     at android.view.View.requestLayout(View.java:15129)
12-01 14:51:25.927: E/AndroidRuntime(3216):     at android.view.View.requestLayout(View.java:15129)
12-01 14:51:25.927: E/AndroidRuntime(3216):     at android.widget.TextView.checkForRelayout(TextView.java:6309)
12-01 14:51:25.927: E/AndroidRuntime(3216):     at android.widget.TextView.setText(TextView.java:3547)
12-01 14:51:25.927: E/AndroidRuntime(3216):     at android.widget.TextView.setText(TextView.java:3405)
12-01 14:51:25.927: E/AndroidRuntime(3216):     at android.widget.TextView.setText(TextView.java:3380)
12-01 14:51:25.927: E/AndroidRuntime(3216):     at com.example.obligatorisk.MainActivity$loader.doInBackground(MainActivity.java:101)
12-01 14:51:25.927: E/AndroidRuntime(3216):     at com.example.obligatorisk.MainActivity$loader.doInBackground(MainActivity.java:1)
12-01 14:51:25.927: E/AndroidRuntime(3216):     at android.os.AsyncTask$2.call(AsyncTask.java:287)
12-01 14:51:25.927: E/AndroidRuntime(3216):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
12-01 14:51:25.927: E/AndroidRuntime(3216):     ... 5 more
(很抱歉出现了文字墙,不确定需要包括哪些内容)

我正在使用的代码:

protected class loader extends AsyncTask<String, Void, Void> {



    @Override
    protected Void doInBackground(String... params) {



        try {


            httpclient = new DefaultHttpClient();
            httppost = new HttpPost("http://myurl.com/phplogin.php");

            nameValuePairs = new ArrayList<NameValuePair>(1);
            nameValuePairs.add(new BasicNameValuePair("username_in",username.getText().toString().trim()));
            nameValuePairs.add(new BasicNameValuePair("password_in",password.getText().toString().trim()));
            httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
            httppost.getEntity().consumeContent();

            response=httpclient.execute(httppost);

            ResponseHandler<String> responseHandler = new BasicResponseHandler();
            String response = httpclient.execute(httppost, responseHandler);

            //Toast.makeText(MainActivity.this,response, Toast.LENGTH_LONG).show();


            if(response.equalsIgnoreCase("User Found"))
            {

                startActivity(new Intent("com.example.obligatorisk.BROWSER"));

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

        return null;
    }


    // TODO Auto-generated method stub

}
受保护的类加载器扩展异步任务{
@凌驾
受保护的Void doInBackground(字符串…参数){
试一试{
httpclient=新的DefaultHttpClient();
httppost=新的httppost(“http://myurl.com/phplogin.php");
nameValuePairs=新的ArrayList(1);
添加(新的BasicNameValuePair(“username_in”,username.getText().toString().trim());
添加(新的BasicNameValuePair(“password_in”,password.getText().toString().trim());
setEntity(新的UrlEncodedFormEntity(nameValuePairs));
httppost.getEntity().consumeContent();
response=httpclient.execute(httppost);
ResponseHandler ResponseHandler=新BasicResponseHandler();
String response=httpclient.execute(httppost,responseHandler);
//Toast.makeText(MainActivity.this,response,Toast.LENGTH_LONG.show();
if(response.equalsIgnoreCase(“用户找到”))
{
startActivity(新意图(“com.example.obligatorisk.BROWSER”);
}
}
捕获(IOE异常){
e、 printStackTrace();
}
返回null;
}
//TODO自动生成的方法存根
}

有人能帮我吗?我已经被困了好几天。

日志上说,
com.example.obligatorisk.MainActivity$loader.doInBackground(MainActivity.java:101)
行的代码试图修改视图,但正在另一个线程中运行

AsyncTask
的思想是将
doInBackground
rus放在不同的线程中:它不能更改在主线程中创建的视图。这就是为什么您有
预执行
后执行

您将获得:

android.view.ViewRootImpl$CalledFromWrongThreadException
因为:

只有创建视图层次结构的原始线程才能接触其视图

我没有办法解决你的问题,但我可以为你指出正确的方向。我假设你试图从一个单独的线程中改变一个观点,这是行不通的。 我相信你必须弄清楚如何从一个单独的线程中改变android视图。 我还快速搜索了一下,发现


答案似乎是正确的。

你不能把这些行放在后台

    nameValuePairs.add(new BasicNameValuePair("username_in",**username.getText().toString().trim()**));
    nameValuePairs.add(new BasicNameValuePair("password_in",**password.getText().toString().trim()**));

因此,在任务开始之前获取数据并将值传递给asyntask…

错误在于不能像这样调用username.gettext().tostring()、password.gettext().tostring()。。
在调用AsyncTask之前,请尝试获取字符串中的值并使用它。

Xortrox您会遇到一个异常,因为您试图从非UI线程更新UI,因此有两种方法可以解决此问题:首先,您可以将活动作为参数传递给AsyncTask,并使用活动的更新UI,但这种方法缺乏一定的灵活性

另一种方法是使用异步交互方式(AsyncTask为this=)),AsyncTask具有在UI线程中运行的和方法,因此我建议您将AsyncTask的返回类型更改为HttpResponse或String,然后在onPostExecute中执行任何处理和更新UI,对我来说,这种方式是最好的

我怀疑

username.getText().toString().trim())
用户名是文本视图吗?(至少是从那里开始的)

无法从非UI线程访问任何视图对象。句号

在启动异步任务之前,将用户名和密码存储在字段中,或者在loader类中创建一个构造函数以接受用户名和密码,并将它们存储在loader类的字段中(首选解决方案)。

作为例外:

Caused by: android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
因此,我们可以知道代码有什么问题

nameValuePairs.add(new BasicNameValuePair("username_in",username.getText().toString().trim()));
nameValuePairs.add(new BasicNameValuePair("password_in",password.getText().toString().trim()));
请确保doInBackground中没有ui代码。 只要您需要访问UI,请将代码放入onPostExecute方法中