0

実際のデバイスで単純な Android コードを実行しようとしていますが、クラッシュし続け、エミュレーターで正常に動作します。

私のコードは

 package com.example.new1;


     import java.io.BufferedReader;
     import java.io.InputStreamReader;
     import java.net.HttpURLConnection;
     import java.net.URL;
     import android.os.AsyncTask;
     import android.os.Bundle;
     import android.app.Activity;
     import android.view.Menu;
     import android.view.View;
     import android.widget.TextView;

     public class MainActivity extends Activity {
     TextView tx;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tx= (TextView)findViewById(R.id.text);
    }

    public void func(View view)
    {
        //tx.setText("Working fine till here.");
         new FetchSQL().execute();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }
    private class FetchSQL  extends AsyncTask<String,Void,String>

    {   

        @Override
        protected String doInBackground(String... arg0) {
                URL url = null;
                BufferedReader reader = null;
                StringBuilder stringBuilder;
                String myUrl = "http://10.22.35.4:80/conc2.php";
            try
            { url =new URL(myUrl);
              HttpURLConnection connection = (HttpURLConnection)      url.openConnection();
              connection.setRequestMethod("GET");
              connection.setReadTimeout(15*10000);
              connection.connect();
              reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
              stringBuilder = new StringBuilder();
              String line = null;
              while ((line = reader.readLine()) != null)
              {
                stringBuilder.append(line + "\n");

              }
            // TODO Auto-generated method stub
            return stringBuilder.toString();
            }
            catch(Exception e)
            {
                tx.setText(e.toString());
            }
            return null;
        } 

        protected void onPostExecute(String result)
        {
             tx.setText(result);
        }


    }
}

エミュレータで正常に動作し、出力が得られます

VMアロラドr. CP REDDYARTI CHOWDHARYJAGDISH SINGH ですが、私のデバイスで同じように実行しています。次のエラーコードが表示されます。

05-03 11:49:39.002: E/AndroidRuntime(19934): FATAL EXCEPTION: AsyncTask #1
05-03 11:49:39.002: E/AndroidRuntime(19934): java.lang.RuntimeException: An error occured while executing doInBackground()
05-03 11:49:39.002: E/AndroidRuntime(19934):    at    android.os.AsyncTask$3.done(AsyncTask.java:200)
05-03 11:49:39.002: E/AndroidRuntime(19934):    at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
05-03 11:49:39.002: E/AndroidRuntime(19934):    at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
05-03 11:49:39.002: E/AndroidRuntime(19934):    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
05-03 11:49:39.002: E/AndroidRuntime(19934):    at java.util.concurrent.FutureTask.run(FutureTask.java:137)
05-03 11:49:39.002: E/AndroidRuntime(19934):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068)
05-03 11:49:39.002: E/AndroidRuntime(19934):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561)
05-03 11:49:39.002: E/AndroidRuntime(19934):    at java.lang.Thread.run(Thread.java:1096)
05-03 11:49:39.002: E/AndroidRuntime(19934): Caused by: android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
05-03 11:49:39.002: E/AndroidRuntime(19934):    at android.view.ViewRoot.checkThread(ViewRoot.java:2811)
05-03 11:49:39.002: E/AndroidRuntime(19934):    at   android.view.ViewRoot.requestLayout(ViewRoot.java:594)
05-03 11:49:39.002: E/AndroidRuntime(19934):    at android.view.View.requestLayout(View.java:8180)
05-03 11:49:39.002: E/AndroidRuntime(19934):    at android.view.View.requestLayout(View.java:8180)
05-03 11:49:39.002: E/AndroidRuntime(19934):    at android.view.View.requestLayout(View.java:8180)
05-03 11:49:39.002: E/AndroidRuntime(19934):    at android.view.View.requestLayout(View.java:8180)
05-03 11:49:39.002: E/AndroidRuntime(19934):    at android.widget.RelativeLayout.requestLayout(RelativeLayout.java:257)
05-03 11:49:39.002: E/AndroidRuntime(19934):    at android.view.View.requestLayout(View.java:8180)
05-03 11:49:39.002: E/AndroidRuntime(19934):    at android.widget.TextView.checkForRelayout(TextView.java:5383)
05-03 11:49:39.002: E/AndroidRuntime(19934):    at android.widget.TextView.setText(TextView.java:2688)
05-03 11:49:39.002: E/AndroidRuntime(19934):    at android.widget.TextView.setText(TextView.java:2556)
05-03 11:49:39.002: E/AndroidRuntime(19934):    at android.widget.TextView.setText(TextView.java:2531)
05-03 11:49:39.002: E/AndroidRuntime(19934):    at com.example.new1.MainActivity$FetchSQL.doInBackground(MainActivity.java:66)
05-03 11:49:39.002: E/AndroidRuntime(19934):    at com.example.new1.MainActivity$FetchSQL.doInBackground(MainActivity.java:1)
05-03 11:49:39.002: E/AndroidRuntime(19934):    at android.os.AsyncTask$2.call(AsyncTask.java:185)
05-03 11:49:39.002: E/AndroidRuntime(19934):    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
05-03 11:49:39.002: E/AndroidRuntime(19934):    ... 4 more

私の実際のデバイスでこの愚かなコードを実行する方法を教えてください。デバイスを手に入れました

GTI-9003 、ANDROID 2.2.1 (FROYO)..そして、このアプリに MIN SDK ..OF 1.5(CUPCAKE) を入れました。

4

4 に答える 4

0

ビューはメイン スレッド (UI スレッド) で作成されましたが、バックグラウンド スレッド (doinbackground() メソッドでの例外処理) からそのビュー (この場合はテキストビュー) を更新しています。したがって、この例外が発生しています。これは UI スレッドで実行されるため、onPOstExecute() メソッドで更新を行います。そして、デバイスから接続しようとしているときに例外が発生するため(おそらく接続を開いているときに、何度も直面したため)、エラーが発生するため、デバイスでのみこの例外が発生します。エミュレータ経由で接続している間、おそらく接続は成功しています。だから、あなたもそれを見なければならないかもしれません。

于 2013-05-03T06:56:47.297 に答える
0

UI を更新するバックグラウンド タスクの部分をメイン スレッドに移動する必要があります。

doInBackground()メソッド内のケースで、バックグラウンド スレッドから UI コンポーネントにアクセスしようとしています。それは許可されていません。

ここを参照

doInBackground(......)
{
  runOnUiThread(new Runnable() {
  public void run() {
     // your code
  }
 });
}
于 2013-05-03T06:33:12.417 に答える