【问题标题】:android.os.NetworkOnMainThreadException and java.lang.reflect.InvocationTargetException [duplicate]android.os.NetworkOnMainThreadException 和 java.lang.reflect.InvocationTargetException [重复]
【发布时间】:2014-01-08 11:22:03
【问题描述】:

我有问题。 我想知道android.os.NetworkOnMainThreadException
java.lang.reflect.InvocationTargetException Exception是从哪里来的!

拜托,我是 Android 新手,我需要你们的帮助!

我的 LogCat:

12-19 13:00:27.049: E/AndroidRuntime(1170): FATAL EXCEPTION: main
12-19 13:00:27.049: E/AndroidRuntime(1170): java.lang.IllegalStateException: Could not execute method of the activity
12-19 13:00:27.049: E/AndroidRuntime(1170):     at android.view.View$1.onClick(View.java:3633)
12-19 13:00:27.049: E/AndroidRuntime(1170):     at android.view.View.performClick(View.java:4240)
12-19 13:00:27.049: E/AndroidRuntime(1170):     at android.view.View$PerformClick.run(View.java:17721)
12-19 13:00:27.049: E/AndroidRuntime(1170):     at android.os.Handler.handleCallback(Handler.java:730)
12-19 13:00:27.049: E/AndroidRuntime(1170):     at android.os.Handler.dispatchMessage(Handler.java:92)
12-19 13:00:27.049: E/AndroidRuntime(1170):     at android.os.Looper.loop(Looper.java:137)
12-19 13:00:27.049: E/AndroidRuntime(1170):     at android.app.ActivityThread.main(ActivityThread.java:5103)
12-19 13:00:27.049: E/AndroidRuntime(1170):     at java.lang.reflect.Method.invokeNative(Native Method)
12-19 13:00:27.049: E/AndroidRuntime(1170):     at java.lang.reflect.Method.invoke(Method.java:525)
12-19 13:00:27.049: E/AndroidRuntime(1170):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
12-19 13:00:27.049: E/AndroidRuntime(1170):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
12-19 13:00:27.049: E/AndroidRuntime(1170):     at dalvik.system.NativeStart.main(Native Method)
12-19 13:00:27.049: E/AndroidRuntime(1170): Caused by: java.lang.reflect.InvocationTargetException
12-19 13:00:27.049: E/AndroidRuntime(1170):     at java.lang.reflect.Method.invokeNative(Native Method)
12-19 13:00:27.049: E/AndroidRuntime(1170):     at java.lang.reflect.Method.invoke(Method.java:525)
12-19 13:00:27.049: E/AndroidRuntime(1170):     at android.view.View$1.onClick(View.java:3628)
12-19 13:00:27.049: E/AndroidRuntime(1170):     ... 11 more
12-19 13:00:27.049: E/AndroidRuntime(1170): Caused by: android.os.NetworkOnMainThreadException
12-19 13:00:27.049: E/AndroidRuntime(1170):     at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1133)
12-19 13:00:27.049: E/AndroidRuntime(1170):     at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:84)
12-19 13:00:27.049: E/AndroidRuntime(1170):     at libcore.io.IoBridge.connectErrno(IoBridge.java:127)
12-19 13:00:27.049: E/AndroidRuntime(1170):     at libcore.io.IoBridge.connect(IoBridge.java:112)
12-19 13:00:27.049: E/AndroidRuntime(1170):     at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192)
12-19 13:00:27.049: E/AndroidRuntime(1170):     at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:459)
12-19 13:00:27.049: E/AndroidRuntime(1170):     at java.net.Socket.connect(Socket.java:842)
12-19 13:00:27.049: E/AndroidRuntime(1170):     at org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:119)
12-19 13:00:27.049: E/AndroidRuntime(1170):     at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:144)
12-19 13:00:27.049: E/AndroidRuntime(1170):     at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
12-19 13:00:27.049: E/AndroidRuntime(1170):     at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
12-19 13:00:27.049: E/AndroidRuntime(1170):     at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
12-19 13:00:27.049: E/AndroidRuntime(1170):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
12-19 13:00:27.049: E/AndroidRuntime(1170):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
12-19 13:00:27.049: E/AndroidRuntime(1170):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
12-19 13:00:27.049: E/AndroidRuntime(1170):     at com.ensem.sehaty.MainActivity.recupererListMed(MainActivity.java:58)
12-19 13:00:27.049: E/AndroidRuntime(1170):     ... 14 more
12-19 13:05:27.366: I/Process(1170): Sending signal. PID: 1170 SIG: 9

MainActivity.java

public class MainActivity extends Activity {

    Button btnRecupListMed = null;
    ListView listeMed = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btnRecupListMed = (Button) findViewById(R.id.btnListMed);
        listeMed = (ListView) findViewById(R.id.listMed);   
    }

    public void recupererListMed(View v){

        BufferedReader br = null;
        StringBuffer sb = new StringBuffer("");

        try {
            HttpClient client = new DefaultHttpClient();
            HttpProtocolParams.setUseExpectContinue(client.getParams(), false);
            HttpGet get = new HttpGet();
            URI uri = new URI("http://105.153.20.252");
            get.setURI(uri);
            HttpResponse reponse = client.execute(get);
            InputStream is = reponse.getEntity().getContent();
            br = new BufferedReader(new InputStreamReader(is));
            String str = br.readLine();
            while(str != null){
                sb.append(str);
                sb.append("\n");
                str = br.readLine();
            }
        } catch (URISyntaxException e) {
            e.printStackTrace();
            System.out.println("Erreur 1");
        } catch (ClientProtocolException e) {
            e.printStackTrace();
            System.out.println("Erreur 2");
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("Erreur 3");
        }

        try {
            //ArrayList<HashMap<String, String>> medecins = new ArrayList<HashMap<String, String>>();

            JSONArray js = new JSONArray(sb.toString());
            List<String> listM = new ArrayList<String>();
            for(int i=0; i<js.length(); i++){               
                    JSONObject jsObj = js.getJSONObject(i);
                    String nom = jsObj.getString("NOMMED");
                    listM.add(nom);
            }

                 ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
                            android.R.layout.simple_list_item_1, R.id.listMed, listM);

                listeMed.setAdapter(adapter);   

        } catch (JSONException e) {
            e.printStackTrace();
            System.out.println("Erreur 4");
        }
    }



    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

}

activity_main.xml

<TextView
        android:text="@string/lbl_sehaty"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        />

    <Button 
        android:id="@+id/btnListMed"
        android:text="@string/lbl_btn"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:onClick="recupererListMed"
        />

    <ListView
              android:id="@+id/listMed"
              android:layout_height="wrap_content"
              android:layout_width="match_parent"
              android:layout_marginTop="60dp">

         </ListView>

而我的Manifest 包含以下权限

<uses-permission android:name="android.permission.INTERNET"></uses-permission>

谢谢。

【问题讨论】:

    标签: java android exception manifest invocationtargetexception


    【解决方案1】:

    当您尝试在 UI 线程上进行服务器调用时会出现此错误。

    您应该创建一个 AsyncTask 并将您的服务器调用放入其中。

    并且点击按钮调用在 asynctask 的对象上执行。

    例如:

    public class ServiceTask extends AsyncTask<String, Void, String> {
    
    
    
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }
    
        @Override
        protected String doInBackground(String... params) {
    
            BufferedReader br = null;
            StringBuffer sb = new StringBuffer("");
    
            try {
                HttpClient client = new DefaultHttpClient();
                HttpProtocolParams.setUseExpectContinue(client.getParams(), false);
                HttpGet get = new HttpGet();
                URI uri = new URI("http://105.153.20.252");
                get.setURI(uri);
                HttpResponse reponse = client.execute(get);
                InputStream is = reponse.getEntity().getContent();
                br = new BufferedReader(new InputStreamReader(is));
                String str = br.readLine();
                while(str != null){
                    sb.append(str);
                    sb.append("\n");
                    str = br.readLine();
                }
    
    
            } catch (URISyntaxException e) {
                e.printStackTrace();
                System.out.println("Erreur 1");
            } catch (ClientProtocolException e) {
                e.printStackTrace();
                System.out.println("Erreur 2");
            } catch (IOException e) {
                e.printStackTrace();
                System.out.println("Erreur 3");
            }
            return sb;
        }
    
        @Override
        protected void onPostExecute(String result) {
            try {
                //ArrayList<HashMap<String, String>> medecins = new ArrayList<HashMap<String, String>>();
    
                JSONArray js = new JSONArray(result.toString());
                List<String> listM = new ArrayList<String>();
                for(int i=0; i<js.length(); i++){               
                        JSONObject jsObj = js.getJSONObject(i);
                        String nom = jsObj.getString("NOMMED");
                        listM.add(nom);
                }
    
                     ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
                                android.R.layout.simple_list_item_1, R.id.listMed, listM);
    
                    listeMed.setAdapter(adapter);   
    
            } catch (JSONException e) {
                e.printStackTrace();
                System.out.println("Erreur 4");
            }
        }
    }
    

    在你的 onClick 事件中:

    public void recupererListMed(View v){
       new ServiceTask().execute();
    }
    

    这将在不同的线程上执行 doInBackground 方法,一旦获取结果,就会在 UI 线程上调用 onPostExecute。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-01
      • 2013-10-16
      • 2013-05-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多