【问题标题】:Android app on real device,crashes when try connecting to server真实设备上的Android应用程序,尝试连接服务器时崩溃
【发布时间】:2013-05-03 06:30:00
【问题描述】:

我正在尝试在我的真实设备上运行一个简单的 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.阿罗拉博士。 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)。

【问题讨论】:

  • 为什么全部大写?奇怪。
  • doInBackground() 方法中注释tx.setText(e.toString()); 行,然后再次发布logcat 输出。
  • 也许你可以用实际的日志更新你的问题。

标签: android connection


【解决方案1】:

这是因为您试图在 doInBackground 方法中更改 UI,实际上是 setText,这并不意味着执行任何 UI 任务。

这里:

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

您可以这样做:

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

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

【讨论】:

  • @archie.bpgc.. tierd wht 你说还是不行..给 java.net.socketException: 操作超时。
  • @yug.socketException 和你发的日志猫完全不一样。你从哪里得到这个例外?您的应用程序是否仍然崩溃或者这是TextView 上的文本?
  • 尝试在添加评论中发布日志输出但不允许。
  • 这个错误出现在我的文本视图中先生..我点击按钮后需要时间..我设置了 15*1000;之后它给出了这个异常
  • 这是预期的。您最好提出与此错误相关的全新问题。或查看stackoverflow.com/questions/4470457/…
【解决方案2】:

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

您正在尝试从 doInBackground() 方法中的后台线程访问 UI 组件。这是不允许的。

参考here

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

【讨论】:

  • 可以在onPostExecute()方法里面访问UI。
【解决方案3】:

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

【讨论】:

  • 在我的真实设备上。我在 xampp 上运行 php webservice
  • textview 上的套接字超时?Wats 确切的例外?您检查过您设备上的互联网连接吗?
  • 我的视图工作正常.. 因为我可以看到异常.. 它的总和.. 有连接..
  • "java.net.socketException: the operation timed out." 加上我在清单文件中添加了权限,并且我的设备数据包已打开。 :P
  • 问题出在您的网络服务上。因为设备一直等到超时再断开连接,这是常态……
【解决方案4】:

doInbackground() 在后台线程上运行。您无法从后台线程更新 ui。您应该在主 UI 线程上更新 ui

您可以将 doinBackground() 中的 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

您也可以使用处理程序

编辑:

我建议不要将 Exception 设置为 textview。

最好只打印异常堆栈跟踪

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

我会在 catch 之后有 1 个 return 语句,并在 try 结束之前删除该语句

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

而不是

        return null;  

【讨论】:

猜你喜欢
  • 2020-03-06
  • 1970-01-01
  • 2023-02-14
  • 1970-01-01
  • 1970-01-01
  • 2018-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多