0

我正在尝试从 YouTube api 获取数据,但是当我使用创建httpclient对象时asyctask出现 NoClassDefFoundError 错误。为什么会出现这个错误?

    import android.content.Intent;
import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Adapter;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;

import com.google.android.youtube.player.YouTubeBaseActivity;
import com.google.android.youtube.player.YouTubeInitializationResult;
import com.google.android.youtube.player.YouTubePlayer;
import com.google.android.youtube.player.YouTubePlayerView;
import com.google.android.youtube.player.YouTubeStandalonePlayer;

import org.apache.http.HttpEntity;
import org.apache.http.HttpRequest;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import org.json.JSONObject;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;

public class MainActivity extends YouTubeBaseActivity {

    private static final String TAG="MainActivity";

    private static String urll="https://www.googleapis.com/youtube/v3/" +
            "videos?part=snippet%2CcontentDetails%2Cstatistics&id=Ks-_Mh1QhMc&key="+YouTubeConfig.getApiKey()+" HTTP/1.1";

    YouTubePlayerView player;
    YouTubePlayer.OnInitializedListener playerInitializer;

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

        ArrayList<String> a= new ArrayList<>();
        for (int x =0; x<100;x++ ){
            a.add(String.valueOf(x));
        }

        ListView lv= findViewById(R.id.izlenecekVideolar);
        ArrayAdapter<String> veriAdaptoru=new ArrayAdapter<String>
                (this, android.R.layout.simple_list_item_1, android.R.id.text1, a);
        lv.setAdapter(veriAdaptoru);
        player = (YouTubePlayerView) findViewById(R.id.youtubeView);
        int d = Log.d(TAG, "onCreate: ");


        new GetYoutube().execute();
        player.initialize(YouTubeConfig.getApiKey(),new YouTubePlayer.OnInitializedListener() {

                    @Override
                    public void onInitializationSuccess(YouTubePlayer.Provider provider, YouTubePlayer youTubePlayer, boolean b) {
                        List<String> izle=new ArrayList<>();
                        izle.add("W4hTJybfU7s");
                        izle.add("co1T0ue8zD8");
                        youTubePlayer.loadVideos(izle);
                        Log.d(TAG, "onInitializationSuccess: ");
                        youTubePlayer.setPlayerStyle(YouTubePlayer.PlayerStyle.MINIMAL);
                    }

                    @Override
                    public void onInitializationFailure(YouTubePlayer.Provider provider, YouTubeInitializationResult youTubeInitializationResult) {
                        Log.d(TAG, "onInitializationFailure: ");
                    }
                }
        );

        Log.d(TAG, "onCreate:initialized ");
    }

    private static class GetYoutube extends AsyncTask<Void,String, String> {

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

        @Override
        protected String doInBackground(Void... voids) {
            HttpClient hc=new DefaultHttpClient();
            HttpGet hget=new HttpGet(urll);
            try {
                HttpResponse response =hc.execute(hget);
                HttpEntity he= response.getEntity();
                String json= EntityUtils.toString(he);
                return json;


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

            return null;
        }

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

            if (s != null)
            {
                try {
                    JSONObject jse=new JSONObject(s);
                    Log.e("response",jse.toString());
                }
                catch (Exception e){

                    e.printStackTrace();
                }

            }

        }
    }
}

LOGCAT

2019-07-27 01:49:22.162 21763-21763/com.gamedu.yourchild E/AndroidRuntime:致命异常:主进程:com.gamedu.yourchild,PID:21763 java.lang.NoClassDefFoundError:解析失败:Lorg/ apache/commons/日志记录/LogFactory;在 org.apache.http.impl.client.AbstractHttpClient.(AbstractHttpClient.java:182) 在 org.apache.http.impl.client.DefaultHttpClient.(DefaultHttpClient.java:150) 在 com.gamedu.yourchild.MainActivity.onCreate (MainActivity.java:68) 在 android.app.Activity.performCreate(Activity.java:7698) 在 android.app.Activity.performCreate(Activity.java:7687) 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java: 1299) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3096) 在 android.app.ActivityThread。

4

1 回答 1

0

首先,这种错误一般不是编码错误,而是因为基础 APK 中有一些损坏的文件,从 logcat 中可以清楚地看到。看到ClassLoader无法从基础 apk 文件中加载特定的类,所以会出现 FATAL Exception ClassNotFound

解决方案: 基本上,这不是一个确定的解决方案,但值得一试,我遇到过类似的问题,经过一番搜索,我发现唯一合理的解决方案是删除所有数据并从设备上卸载应用程序并重新安装。虽然,这不是一个确认的解决方案。

于 2019-07-26T23:31:08.417 回答