0

AsyncTaskで問題が発生しています。ユーザー名が正しいかどうかをMySQLデータベースに接続して確認することになっているphpファイルにアクセスしようとしています。

私が得ているエラーは次のとおりです。

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

}

誰かがここで私を助けてくれますか?私は何日も立ち往生しています。

4

7 に答える 7

0

ログには、行のコードcom.example.obligatorisk.MainActivity$loader.doInBackground(MainActivity.java:101)がビューを変更しようとしているが、別のスレッドで実行されていることが示されています。

の考え方AsyncTaskdoInBackground、別のスレッドのrusです。メインスレッドで作成されたビューを変更することはできません。preExecuteそれがあなたが持っている理由ですpostExecute

于 2012-12-01T14:15:13.870 に答える
0

あなたは次のことを取得しています:

android.view.ViewRootImpl$CalledFromWrongThreadException

なぜなら:

ビュー階層を作成した元のスレッドのみがそのビューにアクセスできます。

私はあなたの問題の解決策を持っていませんが、おそらくあなたを正しい方向に向けることができます。あなたが別のスレッドからビューを変更しようとしていると思いますが、それは機能しません。別のスレッドからAndroidビューを変更する方法を理解する必要があると思います。私も簡単なグーグルをして、これを見つけまし

一番の答えはそれを正しい方法でやっているようです。

于 2012-12-01T14:15:21.560 に答える
0

これらの行を doinbackground 内に配置することはできません

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

タスクの開始前にデータを取得し、値を ayntask に渡します...

于 2012-12-01T14:28:06.657 に答える
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 メソッドにコードを挿入してください

于 2015-05-15T07:39:28.760 に答える
0

エラーは、これらのように username.gettext().tostring(),password.getText().toString() を呼び出せないことです.. AsyncTask を呼び出す前に文字列の値を取得して、それを使用してください..

于 2012-12-01T14:36:52.790 に答える