Android 网络问题 - Udacity Android 网络最终项目使用 Google Book API 和 LoadManager/AsyncTaskLoader

问题描述

我正在从事 Udacity Android Networking 的最终项目 - 使应用在 Google Book API 中搜索书籍,但我的应用不断崩溃,我不知道如何工作或从哪里开始调试。我是Android的新手,所以我还不太了解。如果您知道为什么我的应用程序不断崩溃,请告诉我。非常感谢。

MainActivity.java

package com.example.networkingfinals;

import androidx.appcompat.app.AppCompatActivity;

import android.app.LoaderManager;
import android.content.Loader;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;

import java.util.List;

public abstract class MainActivity extends AppCompatActivity implements LoaderManager.LoaderCallbacks {

    private String url;
    private String input;
    private BookAdapter bookAdapter;


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

        Button button = (Button) findViewById(R.id.submit);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                EditText editText = (EditText) findViewById(R.id.input);
                input = String.valueOf(editText.getText());
                url = "https://www.googleapis.com/books/v1/volumes?q="+input+"&maxResults=3";
            }
        });
        LoaderManager loaderManager = getLoaderManager();
        getLoaderManager().initLoader(0,null,this);//Set loader manager to call asyncloader in onCreateLoader



    }

    @Override
    public Loader<List<BookInfo>> onCreateLoader(int id,Bundle args) {

        return new BookAsync(this,url);
        //Call oncreate Loader,fetching List of Book Info

    }

    public void onLoadFinished(Loader loader,List<BookInfo> bookInfos) {


        //Print\Load the List of BookInfo in the main threat ->Printing our UI


    }

    @Override
    public void onLoaderReset(Loader loader) {
        bookAdapter.clear();

    }
}

Ultils.java

package com.example.networkingfinals;

import android.util.Log;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;

public class Utils {

    public static URL makeURL(String url){
        //Convert string (include user input) into processable URL
        URL mURL = null;
        try {
            mURL = new URL(url);
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
        return mURL;
    }

    public static String makeHTTPRequest(URL url) {

        String jsonRead = null;//Where the return JSON data will be save

        if (url == null) {
            return null;
        }

        HttpURLConnection httpURLConnection = null;
        InputStream inputStreamReader = null;
        //Establish server connection and receiver

        try {
            httpURLConnection = (HttpURLConnection) url.openConnection();
            httpURLConnection.setConnectTimeout(1000);
            httpURLConnection.setReadTimeout(1000);
            httpURLConnection.setRequestMethod("GET");
            httpURLConnection.connect();
            //Ask for needed data
            if (httpURLConnection.getResponseCode() == 200) {
                //Receive/catch received data
                inputStreamReader = httpURLConnection.getInputStream();
                jsonRead = readFromInput(inputStreamReader);
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
        return jsonRead;
    }

    public static String readFromInput(InputStream inputStream) throws IOException {

        String lines = null;//BufferedREader string in a line collection
        StringBuilder stringBuilder = new StringBuilder();//Build String from all the lines
        if (inputStream == null){
            //Check to end program early
            return null;
        }else {
            InputStreamReader inputStreamReader = new InputStreamReader(inputStream,Charset.forName("UTF-8"));
            //inputstreamreader read inputstream
            BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
            //BufferedREader read from input stream reader - buffered in charactor
            lines = bufferedReader.readLine();//MAke String lines
            while (lines != null){
                stringBuilder.append(lines);
                //Add lines of string to string builder -> json doc
                lines = bufferedReader.readLine();

            }

        }
        return stringBuilder.toString();
    }

    public static List<BookInfo> extractJsonBookData(String json) throws JSONException {

        //TODO: Write method extracting json from HTTPRequest
        List<BookInfo> bookInfos = new ArrayList<BookInfo>();// List object store BookInfo object

        JSONObject jsonObject = new JSONObject(json);
        Log.v("JsonExtract","FirstJson Object "+jsonObject);
        JSONArray jsonArray = jsonObject.getJSONArray("items");
        Log.v("JsonExtract","FirstJson Object "+jsonArray);

        for(int i = 0; i<=jsonArray.length();i++){
            String tittle = jsonArray.getJSONObject(i).getJSONObject("volumeInfo").getString("title");
            String author = jsonArray.getJSONObject(i).getJSONObject("volumeInfo").getString("authors");
            Integer pageCount = Integer.valueOf(jsonArray.getJSONObject(i).getJSONObject("volumeInfo").getString("pageCount"));

            bookInfos.add(new BookInfo(tittle,author,pageCount));
        }
        return bookInfos;
    }

    public static List<BookInfo> fetchData(String url) throws JSONException {
        URL murl = makeURL(url);
        String jsonData = makeHTTPRequest(murl);
        List<BookInfo> bookInfoList = extractJsonBookData(jsonData);
        return bookInfoList;
    }

}

BookAdapter.java

package com.example.networkingfinals;

import android.app.LoaderManager;
import android.content.Context;
import android.content.Loader;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import java.util.List;

public class BookAdapter extends ArrayAdapter<BookInfo> {
    //Don't forget to add ArrayAdapter`<BookInfo>`
    public BookAdapter(@NonNull Context context,List<BookInfo> books) {
        super(context,books);//Get input of List of BookInfo objects

    }

    @NonNull
    @Override
    public View getView(int position,@Nullable View convertView,@NonNull ViewGroup parent) {

        if (convertView == null) {
            convertView = LayoutInflater.from(getContext()).inflate(R.layout.book_list_view,parent,false);
            //Set convertView to get UI object from book list view xml
        }

        BookInfo bookInfo = (BookInfo) getItem(position);//Get current position of BookInfo object

        TextView tittle = (TextView) convertView.findViewById(R.id.tittle);
        tittle.setText(bookInfo.getTittile());

        TextView author = (TextView) convertView.findViewById(R.id.author);
        author.setText(bookInfo.getAuthor());

        TextView pageCount = (TextView) convertView.findViewById(R.id.pageNumber);
        pageCount.setText(bookInfo.getPageCount());


        return convertView;
    }

}

BookAsync.java

package com.example.networkingfinals;

import android.content.Context;
import android.util.Log;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import android.content.AsyncTaskLoader;// Make sure to get this import

import org.json.JSONException;

import java.net.URL;
import java.util.List;

public class BookAsync extends AsyncTaskLoader {

    private String mUrl;

    public BookAsync(@NonNull Context context,String url) {
        super(context);
        mUrl = url;
    }

    @Override
    protected void onStartLoading() {
        forceLoad();
    }

    @Nullable
    @Override
    public List<BookInfo> loadInBackground() {

        if (mUrl == null){
            return null;
        }
        List<BookInfo> mainBookInfos = null;
        try {
            mainBookInfos = Utils.fetchData(mUrl);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return mainBookInfos;

    }
}

BookInfo.java

package com.example.networkingfinals;

public class BookInfo {
    String mTittile;
    String mAuthor;
    Integer mPageCount;

    public BookInfo(String tittle,String author,Integer pageCount){
        mTittile = tittle;
        mAuthor = author;
        mPageCount = pageCount;
    }

    public String getAuthor(){
        return mAuthor;
    }
    public String getTittile(){
        return mTittile;
    }
    public Integer getPageCount(){
        return mPageCount;
    }
}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:padding="10dp"
    android:orientation="vertical">

    <EditText
        android:layout_width="209dp"
        android:layout_height="wrap_content"
        android:id="@+id/input"/>
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Submit"
        android:id="@+id/submit"/>


</LinearLayout>

book_list_view.xml

<?xml version="1.0" encoding="utf-8"?>
<ListView
    xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:id="@+id/listView">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/tittle"/>
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/author"/>
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/pageNumber"/>


</ListView>

堆栈跟踪

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.networkingfinals,PID: 10059
    java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.networkingfinals/com.example.networkingfinals.MainActivity}: java.lang.InstantiationException: java.lang.Class<com.example.networkingfinals.MainActivity> cannot be instantiated
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3197)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3412)
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2019)
        at android.os.Handler.dispatchMessage(Handler.java:107)
        at android.os.Looper.loop(Looper.java:214)
        at android.app.ActivityThread.main(ActivityThread.java:7458)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:935)
     Caused by: java.lang.InstantiationException: java.lang.Class<com.example.networkingfinals.MainActivity> cannot be instantiated
        at java.lang.Class.newInstance(Native Method)
        at android.app.AppComponentFactory.instantiateActivity(AppComponentFactory.java:95)
        at androidx.core.app.CoreComponentFactory.instantiateActivity(CoreComponentFactory.java:45)
        at android.app.Instrumentation.newActivity(Instrumentation.java:1251)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3185)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3412) 
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83) 
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2019) 
        at android.os.Handler.dispatchMessage(Handler.java:107) 
        at android.os.Looper.loop(Looper.java:214) 
        at android.app.ActivityThread.main(ActivityThread.java:7458) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:935) 
I/Process: Sending signal. PID: 10059 SIG: 9

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...