2013-05-03 82 views
0

我想在我的真实设备上运行简单的android代码,但它不断崩溃,它在仿真器上正常工作。在真实设备上的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); 
     } 


    } 
} 

它可以在模拟器罚款,输出它给

V. M. ARORADr。 C. P. 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)。

+0

为什么所有的帽子?奇怪。 – Raptor 2013-05-03 06:30:34

+0

在'doInBackground()'方法内注释'tx.setText(e.toString())'行,然后再次发布logcat输出。 – TactMayers 2013-05-03 06:43:16

+0

也许你可以用实际日志更新你的问题。 – Ashwin 2013-05-03 10:33:18

回答

0

您必须将更新ui的后台任务部分移动到主线程上。

您正试图从doInBackground()方法中的背景线程访问您的案例中的UI组件。不允许。

参考here

doInBackground(......) 
{ 
    runOnUiThread(new Runnable() { 
    public void run() { 
    // your code 
    } 
}); 
} 
+0

访问'onPostExecute()'方法内的UI是可以的。 – TactMayers 2013-05-03 06:42:02

+0

做了你说的话。 s,仍然没有工作, – yug 2013-05-03 06:44:46

1

它,因为你正在试图改变用户界面,实际上的setText,在doInBackground方法,并不意味着做任何UI任务。

这里:

catch(Exception e) 
      { 
       tx.setText(e.toString()); 
      } 

你可以简单地这样做:

catch(Exception e) 
      { 
       return e.toString(); 
      } 

onPostExecute,这将被设置为文本您TextView

+0

@ archie.bpgc .. tierd wht你说仍然不能正常工作..给java.net.socketException:操作超时。 – yug 2013-05-03 06:51:53

+0

@ yug.'socketException'与您发布的日志猫完全不同。你从哪里得到这个例外?你的应用程序是否仍然崩溃,或者这是TextView上的文本? – 2013-05-03 06:55:37

+0

尝试在添加评论但不允许的情况下发布日志输出。 – yug 2013-05-03 06:57:34

0

您的视图是在主线程(UI线程)上创建的,但是您正在从后台线程(doinbackground()方法中的异常处理)更新该视图(您的案例中的textview)。所以你得到这个例外。因此,onPOstExecute()方法中的更新操作将在UI线程上运行。 而你只是在设备上收到这个异常,因为在尝试从设备连接时,你会得到一个异常(可能在打开连接时,因为我经常遇到它),因此出现错误。通过模拟器连接时,连接可能成功。所以你也可以看看这个。

+0

我在我的textview上发现了soket超时错误。 – yug 2013-05-03 07:02:18

+0

在我的真实设备上。我在xampp上运行php web服务 – yug 2013-05-03 07:02:54

+0

textview上的套接字超时?你有没有在你的设备上检查互联网连接? – Ashwin 2013-05-03 07:03:58

0

doInbackground()在后台线程上运行。你不能从后台线程更新ui。你应该在主UI线程

您可以更新doinBackground UI()上更新UI作为

 runOnUiThread(new Runnable() //run on ui thread 
       { 
        public void run() 
        { 

         tv.setText("value"); 

       } 
       }); 

另外,您可以在doInbackground返回结果()。结果是onPostExecute()的一个参数。在onPostExecute()更新UI。

检查的标题下,在下面的链接的4个步骤

http://developer.android.com/reference/android/os/AsyncTask.html

的话题你也可以使用一个处理器

编辑:

我建议不例外设置一个textview。

它更好的,你只需打印出异常堆栈跟踪

  catch(Exception e) 
     { 
      e.printStacktrace(); 
     } 

我会赶上后有1个return语句,并删除该语句的密切尝试

 return stringBuilder.toString(); 
     // remove this in try 
     // return the same after catch. 
     // print stack trace. don't set it to textview. 

,而不是

 return null; 
+0

http://stackoverflow.com/questions/16353561/java-net-socketexceptionoperation-time-out-when-running-app-on-real-device – yug 2013-05-03 07:17:55

+0

但这不会帮助我完成我的工作.. – yug 2013-05-03 08:01:34

+0

@yug不要理解你的评论。你不能从后台线程更新ui。你能解释清楚什么行不通? – Raghunandan 2013-05-03 10:34:03

相关问题