Android连接和线程的问题,以及IllegalStateExceptions

时间:2016-01-29 11:12:07

标签: java android multithreading android-asynctask android-networking

这是允许我连接到url并从中检索数据的类。它将JSON数据转换为String。也许这里有问题,我看不到它。我对这种编程很新。

public class NetworkConnection extends AsyncTask<String, Void, String> {
private static final String DEBUG_TAG = "HttpExample";




protected String doInBackground(String... urls) {
    try{
        return downloadUrl(urls[0]);
    } catch (IOException e) {
        return "Unable to retrieve Web Page";
    }
}

//Fetch the data from the URL
public String downloadUrl(String myurl) throws IOException {
    InputStream is = null;
    int len = 500;
    String text = new String();

    try {
        URL url = new URL(myurl);
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setReadTimeout(10000 /* milliseconds */);
        conn.setConnectTimeout(15000 /* milliseconds */);
        conn.setRequestMethod("GET");
        conn.setDoInput(true);

        // Starts the query
        conn.connect();
        int response = conn.getResponseCode();
        Log.d(DEBUG_TAG, "The response is: " + response);
        is = conn.getInputStream();

        try {
                    BufferedReader br = new BufferedReader(
                            new InputStreamReader(
                                    conn.getInputStream()));
                    StringBuilder sb = new StringBuilder();
                    String line;
                    while ((line = br.readLine()) != null) {
                        sb.append(line + "\n");
                    }
                    br.close();
                    JSONArray data = new JSONArray(sb.toString());
                    for (int i = 0; i < data.length(); i++) {
                        JSONObject row = data.getJSONObject(i);
                        String klasse = row.getString("K_Nr");
                        String raum = row.getString("K_Raum");
                        text = text + klasse + ": " + raum + "\n";
                    }
        } catch (IOException e) {

        } catch (JSONException e) {
            e.printStackTrace();
        }


    } finally {
        if (is != null) {
            is.close();
        }
    }
    return text;
}

@Override
protected void onPostExecute(String s){
    super.onPostExecute(s);
}

}

这是主线程UI所在的类。在这里我尝试通过Networkconnection类访问URL。问题是我不知道如何正确编程。

public class Start extends Activity {
// public String  URL = new String("http://10.0.2.2/?action=getKlassen");
// public String  URL = new String("http://127.0.0.1/webservice/ajax.php?action=getKlassen");
public String  URL;
NetworkConnection netCon;
public TextView testAusgabe;


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

    Intent i = getIntent();
    String val = i.getStringExtra("Klasse");
    TextView ausgabe = (TextView) findViewById(R.id.ausgabe);
    testAusgabe = (TextView)findViewById(R.id.testAusgabe);
    netCon = new NetworkConnection();
    URL = new String("http://10.0.2.2/?action=getKlassen");
    ausgabe.setText(val);

}

public void myClickHandler(View view) {
    ConnectivityManager connMgr = (ConnectivityManager)
            getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
    if (networkInfo != null && networkInfo.isConnected()) {
        new NetworkConnection().execute(URL);
    } else {
        testAusgabe.setText("No network connection available.");
    }
}

public void onClick(View view){

}

public void zeigeListe_Click (View view) {

    startActivity(new Intent(this, KlassenView.class));
}
public void ladeDaten_Click(View view) {
    String data;

    data = netCon.doInBackground(URL);
    testAusgabe.setText(data);
}

}

这里我们抛出异常。当我点击应加载数据的按钮时,应用程序崩溃。它肯定有一个线程问题,但我不理解其他例外。如果有人可以提供帮助那真的很棒。提前谢谢。

01-29 11:10:38.776 6648-6648/com.example.httptest E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.httptest, PID: 6648
java.lang.IllegalStateException: Could not execute method for android:onClick
 at android.view.View$DeclaredOnClickListener.onClick(View.java:4452)
 at android.view.View.performClick(View.java:5198)
 at android.view.View$PerformClick.run(View.java:21147)
 at android.os.Handler.handleCallback(Handler.java:739)
 at android.os.Handler.dispatchMessage(Handler.java:95)
 at android.os.Looper.loop(Looper.java:148)
 at android.app.ActivityThread.main(ActivityThread.java:5417)
 at java.lang.reflect.Method.invoke(Native Method)
 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Caused by: java.lang.reflect.InvocationTargetException
 at java.lang.reflect.Method.invoke(Native Method)
 at android.view.View$DeclaredOnClickListener.onClick(View.java:4447)
 at android.view.View.performClick(View.java:5198) 
 at android.view.View$PerformClick.run(View.java:21147) 
 at android.os.Handler.handleCallback(Handler.java:739) 
 at android.os.Handler.dispatchMessage(Handler.java:95) 
 at android.os.Looper.loop(Looper.java:148) 
 at android.app.ActivityThread.main(ActivityThread.java:5417) 
 at java.lang.reflect.Method.invoke(Native Method) 
 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
Caused by: android.os.NetworkOnMainThreadException
 at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1273)
 at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:110)
 at libcore.io.IoBridge.connectErrno(IoBridge.java:154)
 at libcore.io.IoBridge.connect(IoBridge.java:122)
 at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:183)
 at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:452)
 at java.net.Socket.connect(Socket.java:884)
 at com.android.okhttp.internal.Platform.connectSocket(Platform.java:117)
 at com.android.okhttp.internal.http.SocketConnector.connectRawSocket(SocketConnector.java:160)
 at com.android.okhttp.internal.http.SocketConnector.connectCleartext(SocketConnector.java:67)
 at com.android.okhttp.Connection.connect(Connection.java:152)
 at com.android.okhttp.Connection.connectAndSetOwner(Connection.java:185)
 at com.android.okhttp.OkHttpClient$1.connectAndSetOwner(OkHttpClient.java:128)
 at com.android.okhttp.internal.http.HttpEngine.nextConnection(HttpEngine.java:341)
 at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:330)
 at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:248)
 at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:433)
 at com.android.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:114)
 at com.example.httptest.NetworkConnection.downloadUrl(NetworkConnection.java:50)
 at com.example.httptest.NetworkConnection.doInBackground(NetworkConnection.java:29)
 at com.example.httptest.Start.ladeDaten_Click(Start.java:62)
 at java.lang.reflect.Method.invoke(Native Method) 
 at android.view.View$DeclaredOnClickListener.onClick(View.java:4447) 
 at android.view.View.performClick(View.java:5198) 
 at android.view.View$PerformClick.run(View.java:21147) 
 at android.os.Handler.handleCallback(Handler.java:739) 
 at android.os.Handler.dispatchMessage(Handler.java:95) 
 at android.os.Looper.loop(Looper.java:148) 
 at android.app.ActivityThread.main(ActivityThread.java:5417) 
 at java.lang.reflect.Method.invoke(Native Method) 
 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

2 个答案:

答案 0 :(得分:2)

其实!你在代码中犯了一个错误。 你必须使用
netCon.execute(URL);代替 netCon.doInBackground(URL);  并且一旦调用了execute()方法并且在完成前一个doInBackground()之前再次单击以启动此方法,则会再次发生异常。 做一件事: 在onPreExecute()内部方法中,阻止你的按钮再次点击和onPostExecute(),再次点击它。

因此,通过这种方式,您无法创建新线程。 干杯!

答案 1 :(得分:0)

您可以在LogCat中看到您有NetworkOnMainThreadException

如果您尝试在主线程中执行网络代码,则会发生此类异常。

对此类代码使用AsyncTask或线程。