0

私の問題は android.os.NetworkOnMainThreadException です。スタックオーバーフローですでにいくつかの回答を見ましたが、解決できません。

08-09 17:15:57.066: E/AndroidRuntime(6285): FATAL EXCEPTION: main
08-09 17:15:57.066: E/AndroidRuntime(6285): java.lang.RuntimeException: Unable to start activity ComponentInfo{br.com.itechtc.curtamais/br.com.itechtc.curtamais.activities.MainActivity}: android.os.NetworkOnMainThreadException
08-09 17:15:57.066: E/AndroidRuntime(6285):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2073)
08-09 17:15:57.066: E/AndroidRuntime(6285):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2098)
08-09 17:15:57.066: E/AndroidRuntime(6285):     at android.app.ActivityThread.access$600(ActivityThread.java:138)
08-09 17:15:57.066: E/AndroidRuntime(6285):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1204)
08-09 17:15:57.066: E/AndroidRuntime(6285):     at android.os.Handler.dispatchMessage(Handler.java:99)
08-09 17:15:57.066: E/AndroidRuntime(6285):     at android.os.Looper.loop(Looper.java:137)
08-09 17:15:57.066: E/AndroidRuntime(6285):     at android.app.ActivityThread.main(ActivityThread.java:4945)
08-09 17:15:57.066: E/AndroidRuntime(6285):     at java.lang.reflect.Method.invokeNative(Native Method)
08-09 17:15:57.066: E/AndroidRuntime(6285):     at java.lang.reflect.Method.invoke(Method.java:511)
08-09 17:15:57.066: E/AndroidRuntime(6285):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:794)
08-09 17:15:57.066: E/AndroidRuntime(6285):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:561)
08-09 17:15:57.066: E/AndroidRuntime(6285):     at dalvik.system.NativeStart.main(Native Method)
08-09 17:15:57.066: E/AndroidRuntime(6285): Caused by: android.os.NetworkOnMainThreadException
08-09 17:15:57.066: E/AndroidRuntime(6285):     at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1117)
08-09 17:15:57.066: E/AndroidRuntime(6285):     at java.net.InetAddress.lookupHostByName(InetAddress.java:425)
08-09 17:15:57.066: E/AndroidRuntime(6285):     at java.net.InetAddress.getAllByNameImpl(InetAddress.java:276)
08-09 17:15:57.066: E/AndroidRuntime(6285):     at java.net.InetAddress.getAllByName(InetAddress.java:250)
08-09 17:15:57.066: E/AndroidRuntime(6285):     at libcore.net.http.HttpConnection.<init>(HttpConnection.java:70)
08-09 17:15:57.066: E/AndroidRuntime(6285):     at libcore.net.http.HttpConnection.<init>(HttpConnection.java:50)
08-09 17:15:57.066: E/AndroidRuntime(6285):     at libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:340)
08-09 17:15:57.066: E/AndroidRuntime(6285):     at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:87)
08-09 17:15:57.066: E/AndroidRuntime(6285):     at libcore.net.http.HttpConnection.connect(HttpConnection.java:128)
08-09 17:15:57.066: E/AndroidRuntime(6285):     at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:315)
08-09 17:15:57.066: E/AndroidRuntime(6285):     at libcore.net.http.HttpEngine.connect(HttpEngine.java:310)
08-09 17:15:57.066: E/AndroidRuntime(6285):     at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:289)
08-09 17:15:57.066: E/AndroidRuntime(6285):     at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:239)
08-09 17:15:57.066: E/AndroidRuntime(6285):     at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:273)
08-09 17:15:57.066: E/AndroidRuntime(6285):     at libcore.net.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:168)
08-09 17:15:57.066: E/AndroidRuntime(6285):     at java.net.URL.openStream(URL.java:462)
08-09 17:15:57.066: E/AndroidRuntime(6285):     at org.codehaus.jackson.JsonFactory._optimizedStreamFromURL(JsonFactory.java:935)
08-09 17:15:57.066: E/AndroidRuntime(6285):     at org.codehaus.jackson.JsonFactory.createJsonParser(JsonFactory.java:530)
08-09 17:15:57.066: E/AndroidRuntime(6285):     at org.codehaus.jackson.map.ObjectMapper.readValue(ObjectMapper.java:1593)
08-09 17:15:57.066: E/AndroidRuntime(6285):     at br.com.itechtc.curtamais.business.PublicidadeBO.converterJson(PublicidadeBO.java:31)
08-09 17:15:57.066: E/AndroidRuntime(6285):     at br.com.itechtc.curtamais.business.PublicidadeBO.<init>(PublicidadeBO.java:19)
08-09 17:15:57.066: E/AndroidRuntime(6285):     at br.com.itechtc.curtamais.fragments.HomeFragment$CarregaDadosCaller.onPreExecute(HomeFragment.java:265)
08-09 17:15:57.066: E/AndroidRuntime(6285):     at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:586)
08-09 17:15:57.066: E/AndroidRuntime(6285):     at android.os.AsyncTask.execute(AsyncTask.java:534)
08-09 17:15:57.066: E/AndroidRuntime(6285):     at br.com.itechtc.curtamais.fragments.HomeFragment.onCreateView(HomeFragment.java:57)
08-09 17:15:57.066: E/AndroidRuntime(6285):     at android.support.v4.app.Fragment.performCreateView(Fragment.java:1504)
08-09 17:15:57.066: E/AndroidRuntime(6285):     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:942)
08-09 17:15:57.066: E/AndroidRuntime(6285):     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1121)
08-09 17:15:57.066: E/AndroidRuntime(6285):     at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
08-09 17:15:57.066: E/AndroidRuntime(6285):     at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1484)
08-09 17:15:57.066: E/AndroidRuntime(6285):     at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:571)
08-09 17:15:57.066: E/AndroidRuntime(6285):     at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1166)
08-09 17:15:57.066: E/AndroidRuntime(6285):     at android.app.Activity.performStart(Activity.java:5212)
08-09 17:15:57.066: E/AndroidRuntime(6285):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2046)
08-09 17:15:57.066: E/AndroidRuntime(6285):     ... 11 more

まず、Jackson を使用して JSON の情報を Java オブジェクトにバインドします。Jackson のせいで NetworkOnMainThread の問題を経験した人はいますか?

この方法でクラス PublicidadeBO に変換します。

public PublicidadeBO(String url) {
    // TODO Auto-generated constructor stub
    converterJson(url);
}

public void convertToJson(String url) {
     lista = new ArrayList<Publicidade>();
    try {
        ObjectMapper mapper = new ObjectMapper();
        lista = mapper.readValue(new URL(url), mapper.getTypeFactory().constructCollectionType(List.class, Publicidade.class));
    } catch (IOException e) {
        Log.i("json", "Erro no JSON");
        e.printStackTrace();
    }
}

そして、別の Activity クラスで:

private class CarregaDadosCaller extends AsyncTask<Void, Void, Void> {
    private PublicidadeBO publicidade; 
    private EventoBO evento; 

    @Override
    protected void onPreExecute() {
        // TODO Auto-generated method stub
        publicidade = new PublicidadeBO("http://urlhere");
        evento = new EventoBO("http://urlhere");
        carregaDados();
        super.onPreExecute();
    }

    @Override
    protected Void doInBackground(Void... params) {
        // TODO Auto-generated method stub
        return null;
    }

    public void carregaDados() {
        String publicidadeUrl = publicidade.concatenarUrlComSlug("http://urlhere");
        evento.popularListaImagemChamada("http://urlhere");
        evento.popularListaTitulo();
    }
    @Override
    protected void onPostExecute(Void result) {
        // TODO Auto-generated method stub
        ImageViewTask taskImageView = new ImageViewTask();  
        taskImageView.execute(publicidadeUrl);

        ImageSwitcherTask taskImageSwitcher = new ImageSwitcherTask();
        String[] strArray = evento.getLinksEvento().toArray(new String[0]);
        taskImageSwitcher.execute(strArray);

        super.onPostExecute(result);
    }
}

前もって感謝します。

4

2 に答える 2

2

carregaDados()バックグラウンド スレッド内でネットワーク リクエストを実行する必要があります。doInBackgroundAsyncTaskのメソッドで実行できます。

@Override
protected void onPreExecute() {
    super.onPreExecute();
}

@Override
protected Void doInBackground(Void... params) {
    publicidade = new PublicidadeBO("http://urlhere");
    evento = new EventoBO("http://urlhere");
    carregaDados();
    return null;
}

ところで、実際には AsyncTask の戻り値を使用する必要があります。

于 2014-08-09T17:13:18.360 に答える
0

cargarDatos() と doInBackground(); を実行する必要があります。
cargarDatos() メソッドを doInBackground(); に移動する必要があります。

@Override
    protected void onPreExecute() {
        // TODO Auto-generated method stub
        publicidade = new PublicidadeBO("http://urlhere");
        evento = new EventoBO("http://urlhere");
//        carregaDados(); This Code is commented
        super.onPreExecute();
    }

    @Override
    protected Void doInBackground(Void... params) {
        carregaDados();///Line addded
        return null;
    }
于 2014-08-09T17:17:55.530 に答える