【问题标题】:Android : Getting RuntimeException on AsyncTaskAndroid:在 AsyncTask 上获取 RuntimeException
【发布时间】:2012-09-28 12:56:53
【问题描述】:

在代码中,我尝试使用 http 客户端从 Web 服务中读取数据。然后我想将http响应的响应短语写入文本视图。 UI 是通过 onPostExecute() 访问的,所以我不知道为什么会出现这个异常。

这是代码:

public class CustomersScreen extends Activity {

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.customersscreen);
}

public void LoginClicked(View view) {
    new Get_data().execute("http://localhost:51982/WcfDataService1.svc/Genre");
}

private class Get_data extends AsyncTask <String, Void, String> {

    @Override
    protected String doInBackground(String... url) {
        //InputStream instream = null;
        HttpClient httpclient = new DefaultHttpClient();
        HttpGet request = new HttpGet(url[0]);
        HttpResponse response = null;
        try {
            response = httpclient.execute(request);
        } catch (ClientProtocolException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        String phrase = response.getStatusLine().getReasonPhrase();

        return phrase;
    }

    @Override
    protected void onPostExecute(String phrase) {
        TextView t = (TextView) findViewById(R.id.textView3);
        t.setText(phrase);
    }

}

}

还有日志猫:

09-28 09:43:34.239: E/AndroidRuntime(679): FATAL EXCEPTION: AsyncTask #1
09-28 09:43:34.239: E/AndroidRuntime(679): java.lang.RuntimeException: An error occured while executing doInBackground()
09-28 09:43:34.239: E/AndroidRuntime(679):  at android.os.AsyncTask$3.done(AsyncTask.java:278)
09-28 09:43:34.239: E/AndroidRuntime(679):  at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
09-28 09:43:34.239: E/AndroidRuntime(679):  at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
09-28 09:43:34.239: E/AndroidRuntime(679):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
09-28 09:43:34.239: E/AndroidRuntime(679):  at java.util.concurrent.FutureTask.run(FutureTask.java:137)
09-28 09:43:34.239: E/AndroidRuntime(679):  at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:208)
09-28 09:43:34.239: E/AndroidRuntime(679):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
09-28 09:43:34.239: E/AndroidRuntime(679):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
09-28 09:43:34.239: E/AndroidRuntime(679):  at java.lang.Thread.run(Thread.java:856)
09-28 09:43:34.239: E/AndroidRuntime(679): Caused by: java.lang.NullPointerException
09-28 09:43:34.239: E/AndroidRuntime(679):  at com.test.CustomersScreen$Get_data.doInBackground(CustomersScreen.java:46)
09-28 09:43:34.239: E/AndroidRuntime(679):  at com.test.CustomersScreen$Get_data.doInBackground(CustomersScreen.java:1)
09-28 09:43:34.239: E/AndroidRuntime(679):  at android.os.AsyncTask$2.call(AsyncTask.java:264)
09-28 09:43:34.239: E/AndroidRuntime(679):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
09-28 09:43:34.239: E/AndroidRuntime(679):  ... 5 more

【问题讨论】:

  • Caused by: java.lang.NullPointerException at com.test.CustomersScreen$Get_data.doInBackground(CustomersScreen.java:46)。检查CustomersScreen.java第46行的语句
  • 为什么不直接调试呢?在 CustomersScreen 类的第 46 行放置一个断点,然后运行它。我敢打赌它是 t.setText(phrase) 并且 t 为空

标签: android android-emulator android-asynctask runtimeexception


【解决方案1】:
Caused by: java.lang.NullPointerException
09-28 09:43:34.239: E/AndroidRuntime(679):  at com.test.CustomersScreen$Get_data.doInBackground(CustomersScreen.java:46)

您在班级的第 46 行有一个 NPE。发布的代码显然缺少一些行,但我想这是String phrase = response.getStatusLine().getReasonPhrase(); 这一行,因为如果httpclient.execute(request); 出现任何问题,response 将是null

因此,只需将该行也放入 try/catch 块中,然后在方法末尾添加一个简单的 return null;

【讨论】:

  • 感谢真正有帮助的人。似乎我的回应 = httpclient.execute(request);得到一个 HttpHostConnectionException 我现在想弄清楚。它说与localhost:51982 的连接被拒绝
  • 好吧,localhost 就是 Android 设备本身——您必须提供 IP 地址(但不是 127.0.0.1),即使您是针对本地服务器进行测试。
  • 我尝试了本地IP地址,因为服务器在同一台计算机上并且有相同的异常。所以很可能需要互联网 IP 地址
  • developer.android.com/tools/devices/… 这是需要的地址。终于成功了
  • 如果服务器是localhost,则必须使用10.0.2.2作为ip。这个ip被模拟器当作localhost。
猜你喜欢
  • 2013-09-03
  • 2013-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-28
相关资源
最近更新 更多