我在使用AsyncTask时遇到了一些麻烦。我试图达到一个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
}
有人可以帮助我吗?我已经被困了好几天了。
答案 0 :(得分:1)
Xortrox你得到一个例外,因为你试图从非线程更新UI,所以有两种解决方法:首先你可以将你的活动作为参数传递给AsyncTask并使用活动的runOnUiThread method来更新UI,但这种方式缺乏一些优雅。
另一种方法是使用异步交互方式(AsyncTask是为此做的)),AsyncTask有onPreExecute和onPostExecute方法在UI线程中运行,所以我建议你改变将AsyncTask的返回类型转换为HttpResponse或String,然后在onPostExecute中执行任何处理和更新UI,对我来说这种方式是最好的
答案 1 :(得分:0)
日志显示第com.example.obligatorisk.MainActivity$loader.doInBackground(MainActivity.java:101)
行的代码尝试修改视图,但是在另一个线程中运行。
AsyncTask
的想法是doInBackground
rus在另一个线程中:它无法更改在主线程中创建的视图。这就是您preExecute
和postExecute
答案 2 :(得分:0)
你得到了:
android.view.ViewRootImpl$CalledFromWrongThreadException
,因为:
只有创建视图层次结构的原始线程才能触及其视图。
我没有解决你的问题,但我可能会指出你正确的方向。我假设你试图从一个单独的线程改变一个视图,这不会起作用。 我相信你必须弄清楚如何从一个单独的线程更改一个android视图。 我也做了一个快速谷歌,发现this
最佳答案似乎是以正确的方式做到了。
答案 3 :(得分:0)
你不能将这些行放在doinbackground中
nameValuePairs.add(new BasicNameValuePair("username_in",**username.getText().toString().trim()**));
nameValuePairs.add(new BasicNameValuePair("password_in",**password.getText().toString().trim()**));
所以在任务开始之前获取数据并将值传递给asyntask ...
答案 4 :(得分:0)
错误是你不能调用username.gettext()。tostring(),password.getText()。toString()就像这些.. 尝试在调用AsyncTask之前获取字符串中的值并使用它..
答案 5 :(得分:0)
我怀疑在
username.getText().toString().trim())
用户名是TextView吗? (至少getText来自那里)
您无法从非UI线程访问任何View对象。 PERIOD。
在启动AsyncTask之前将用户名和密码存储在字段中,或者在loader类中创建构造函数以接受用户名和密码,并将它们存储在loader类的字段中(首选解决方案)。
答案 6 :(得分:0)
作为例外:
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方法