繁体   English   中英

使用后台线程进行活动后,应用程序崩溃

[英]App crashes after intent to activity using background thread

我整天都在遇到这个问题。 我制作了一个应用程序,该应用程序使用JSON从服务器获取数据并将其转换并显示在应用程序中。 我将其作为一个单独的工作应用程序进行,只有一个活动。 下一步是制作一个使用多个活动的应用程序。 我已经制作了一个带有用于执行该活动的按钮的主屏幕,该按钮应该与其他应用程序相同。 当我打开应用程序时,一切正常,但是当我浏览另一个(接收器)屏幕时,应用程序崩溃。 我猜是因为它没有在ui线程上运行,但是我无法弄清楚。如果有人可以帮助我,那太好了! 非常感谢。

错误

11-03 18:03:35.460    6159-6235/me.janvandijk.receptenapp E/AndroidRuntime﹕ FATAL EXCEPTION: AsyncTask #1
Process: me.janvandijk.receptenapp, PID: 6159
java.lang.RuntimeException: An error occured while executing doInBackground()
        at android.os.AsyncTask$3.done(AsyncTask.java:304)
        at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
        at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
        at java.util.concurrent.FutureTask.run(FutureTask.java:242)
        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
        at java.lang.Thread.run(Thread.java:818)
Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
        at android.os.Handler.<init>(Handler.java:200)
        at android.os.Handler.<init>(Handler.java:114)
        at android.app.Activity.<init>(Activity.java:794)
        at me.janvandijk.receptenapp.Recepten.<init>(Recepten.java:24)
        at me.janvandijk.receptenapp.ReceptenDefine.<init>(ReceptenDefine.java:12)
        at me.janvandijk.receptenapp.Recepten$ReceptenAsynTask.doInBackground(Recepten.java:60)
        at me.janvandijk.receptenapp.Recepten$ReceptenAsynTask.doInBackground(Recepten.java:42)
        at android.os.AsyncTask$2.call(AsyncTask.java:292)
        at java.util.concurrent.FutureTask.run(FutureTask.java:237)
        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
        at java.lang.Thread.run(Thread.java:818)

JSON:

[{"id":"1",
    "naam":"Bastogneparfait a la Kim",
    "beschrijving":"Gemaakt van Bastogne, het lekkerste gerecht ooit!",
    "ingredienten":"Bastogne parfait ingredi\u00ebnten\r\n40 gram eierdooiers (gepasteuriseerd)\r\n45 gram hele eieren (gepasteuriseerd)\r\n100 gram suiker \r\n2,5 dl slagroom ongezoet\r\n4  bastognekoeken \r\nKaralmelsaus ingredi\u00ebnten\r\n100 gram suiker \r\n2 dl koksroom ",
    "bereiding":"Slagroom opkloppen tot yoghurt dikte. De eidooiers, hele eieren en suiker in een bekken doen en au bain-marie verwarmen tot 37 graden Celsius. Koud kloppen in de keukenmachine tot een luchtige massa. Spatel de massa door de slagroom. Kruimel de bastognekoeken en spatel ze voorzichtig door de massa. Vul de vormpjes en zet in diepvries.\nBereidingswijze karamelsaus\nDoe de suiker in een pan en verwarm de suiker tot deze is gekaramelliseerd. Haal de pan van het vuur en voeg de koksroom toe. Laat de karamel goed oplossen in de koksroom regelmatig roeren. Als de massa glad is af laten koelen.\nOpdienen\nHaal de parfait uit de vorm en leg in een tapasschaaltje. Doe er karamelsaus bij en een toefje slagroom op de parfait. Eventueel af garneren met een takje mint.",
    "auteur":"3",
    "timestamp":"2015-10-22 14:42:14"},
{"id":"2",
    "naam":"Vlindertjes met kip, spekjes en roomsaus",
    "beschrijving":"Lekker lekker!",
    "ingredienten":"Een beetje liefde\r\nEen beetje kip\r\nEen beetje spekjes\r\nEen beetje kruidenshit\r\nEen beetje creeemeee freeescheee\r\nEn vlindertjes",
    "bereiding":"In pan hop klaar!",
    "auteur":"1",
    "timestamp":"2015-11-02 09:50:54"}]

公共类家庭扩展活动

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

public void showReceptenScherm(View view){
    Intent intent = new Intent(Home.this, Recepten.class);
    startActivity(intent);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.menu_home, menu);
    return true;
}

public void onRadioButtonClicked(View view) {
    Toast.makeText(getApplicationContext(), "Sending your vote..", Toast.LENGTH_LONG).show();


}

受体活性

    ListView list;
ReceptenAdapter adapter;
ArrayList<ReceptenDefine> receptenList;

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

    list = (ListView)findViewById(R.id.receptenList);
    receptenList = new ArrayList<>();

    new ReceptenAsynTask().execute("http://janvandijk.me/zooi/receptenapp/getrecipes.php?type=request&datatype=recepten");
}


public class ReceptenAsynTask extends AsyncTask<String, Void, Boolean> {

    @Override
    protected Boolean doInBackground(String... params) {
        try {
            HttpClient client = new SystemDefaultHttpClient();
            HttpPost post = new HttpPost(params[0]);
            HttpResponse response = client.execute(post);

            int status = response.getStatusLine().getStatusCode();

            if (status == 200){
                HttpEntity entity = response.getEntity();
                String data = EntityUtils.toString(entity);

                JSONArray jArray = new JSONArray(data); //jArray.length()
                for (int i=0; i<jArray.length(); i++){
                    ReceptenDefine recept;
                    recept = new ReceptenDefine();

                    JSONObject jRealObject = jArray.getJSONObject(i);

                    recept.setReceptnaam(jRealObject.getString("naam"));
                    recept.setReceptauthor(jRealObject.getString("id"));
                    recept.setReceptimageurl("http://www.crossfitswarm.com/wp-content/uploads/2013/03/food-photo-200x200.png");
                    recept.setReceptrating(jRealObject.getString("ingredienten"));

                    receptenList.add(recept);

                }
                return true;


            }

        } catch (JSONException | IOException e) {
            e.printStackTrace();
        }
        return false;
    }

    @Override
    protected void onPostExecute(Boolean result){
        super.onPostExecute(result);

        if(!result){
            //Show message that data wasn't parsed
        } else {
            ReceptenAdapter adapter = new ReceptenAdapter(getApplicationContext(), R.layout.row, receptenList);
            list.setAdapter(adapter);
        }



    }
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.menu_recepten, menu);

    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();

    //noinspection SimplifiableIfStatement
    if (id == R.id.action_settings) {

        return true;
    }

    return super.onOptionsItemSelected(item);
}

接受定义

public class ReceptenDefine extends Recepten {
private String receptnaam;
private String receptauthor;
private String receptimageurl;
private String receptrating;

public ReceptenDefine(){

}

public String getReceptnaam() {
    return receptnaam;
}

public void setReceptnaam(String receptnaam) {
    this.receptnaam = receptnaam;
}

public String getReceptauthor() {
    return receptauthor;
}

public void setReceptauthor(String receptauthor) {
    this.receptauthor = receptauthor;
}

public String getReceptimageurl() {
    return receptimageurl;
}

public void setReceptimageurl(String receptimageurl) {
    this.receptimageurl = receptimageurl;
}

public String getReceptrating() {
    return receptrating;
}

public void setReceptrating(String receptrating) {
    this.receptrating = receptrating;
}

受体适配器

public class ReceptenAdapter extends ArrayAdapter<ReceptenDefine>{

ArrayList<ReceptenDefine> ArrayListRecepten;
int Resource;
Context context;
LayoutInflater vi;


public ReceptenAdapter(Context context, int resource, ArrayList<ReceptenDefine> objects) {
    super(context, resource, objects);

    ArrayListRecepten = objects;
    Resource = resource;
    this.context = context;

    vi = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); //Verschillende items laten zien

}

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

    ViewHolder holder;

    if(convertView == null){
        //Eerste listview item wordt gemaakt
        convertView = vi.inflate(Resource, null);
        holder = new ViewHolder();

        //Set all textview and imageview dingen



        holder.listImage = (ImageView)convertView.findViewById(R.id.listImage);
        holder.listAuthor = (TextView)convertView.findViewById(R.id.listAuthor);
        holder.listName = (TextView)convertView.findViewById(R.id.listName);
        holder.listRating = (TextView)convertView.findViewById(R.id.listRating);

        //Zet het neer
        convertView.setTag(holder);
    } else {
        //volgende list items, doe alles opnieuw zetten
        holder = (ViewHolder)convertView.getTag();
    }

    new DownloadImageTask(holder.listImage).execute(ArrayListRecepten.get(position).getReceptimageurl());
    holder.listName.setText(ArrayListRecepten.get(position).getReceptnaam());
    holder.listAuthor.setText(ArrayListRecepten.get(position).getReceptauthor());
    holder.listRating.setText(ArrayListRecepten.get(position).getReceptrating());
    return convertView;
}

static class ViewHolder {
    public ImageView listImage;
    public TextView listName;
    public TextView listAuthor;
    public TextView listRating;
}

private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> {
    ImageView bmImage;

    public DownloadImageTask(ImageView bmImage) {
        this.bmImage = bmImage;
    }
    protected Bitmap doInBackground(String... urls) {
        String urldisplay = urls[0];
        Bitmap mIcon = null;
        try {
            InputStream in = new java.net.URL(urldisplay).openStream();
            mIcon = BitmapFactory.decodeStream(in);
        } catch (Exception e) {
            Log.e("Error", e.getMessage());
            e.printStackTrace();
        }
        return mIcon;
    }

    protected void onPostExecute(Bitmap result) {
        bmImage.setImageBitmap(result);
    }
}

}

这里:

public class ReceptenDefine extends Recepten {
 ...                                 ^^^^^^
}

扩展Recepten类中Activity子类ReceptenDefine引起问题。

由于ReceptenDefine类仅包含getter-setter方法,因此无需为该类扩展ActivityRecepten类。 只需将其用作普通班。

要解决此问题,请从ReceptenDefine类中移除扩展:

public class ReceptenDefine {
 ...                                
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM