2012-12-01 58 views
0

我在AsyncTask中遇到了一些麻烦。我试图达到一个PHP文件多数民众赞成本应该连接和检查MySQL数据库如果用户名是正确的。ASyncTask麻烦 - 执行doInBackground时发生错误

我得到的错误是:

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 

(对不起,文字的墙,不知道什么nessecary包括)

我一起工作的代码:

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

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

AsyncTask的想法是,doInBackground rus在不同的线程:它不能改变在主线程中创建的视图。这就是为什么你必须preExecutepostExecute

0

你得到一个:

android.view.ViewRootImpl$CalledFromWrongThreadException 

因为:

只有创建视图层次可以触摸其观点原来的线程。

我没有解决您的问题,但我可能会指出你在正确的方向。我假设你正在尝试从单独的线程更改视图,这将无法正常工作。 我相信你必须弄清楚如何从一个单独的线程改变一个android视图。 我也做了一个快速的谷歌,发现this

顶部的答案似乎是正确的做法。

0

你不能把这些行内doinbackground

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

任务开始前,所以得到的数据并传递价值的asyntask ...

0

的错误是你不能调用username.gettext()。的toString (),password.getText()。toString()like these。 尝试在调用AsyncTask并使用它之前获取字符串中的值。

1

Xortrox由于您尝试更新UI从不是UI线程,所以有两种方式活动:首先,您可以将活动作为参数传递给AsyncTask并使用活动的runOnUiThread method来更新UI,但这种方式缺乏一些优雅。

另一种方法是使用交互的异步方式(的AsyncTask为这个做=))的AsyncTask具有在UI线程中运行onPreExecuteonPostExecute方法,所以我建议你到你的AsyncTask的返回类型更改为无论是HttpResponse对象或字符串,然后做任何处理和更新UI在onPostExecute,对我来说这样是最好的

0

我怀疑在

username.getText().toString().trim()) 

的用户名是一个TextView? (至少getText是从那里)

你不能从一个非UI线程访问任何视图对象。期。

贮存于装载机类开始的AsyncTask或创建一个构造为接受用户名和密码,并且将它们在字段存储在装载类(优选溶液)之前在一个字段中的用户名和密码。

0

AS例外:

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中没有用户代码。 只要你需要访问的用户界面,请把代码放到onPostExecute方法

相关问题