通过Runnable启动新活动

时间:2012-01-11 11:56:53

标签: android multithreading android-activity handler runnable

我检查Thread中的字符串是否为NULL,如果为null,则处理程序启动 一个Runnable,它启动一个新的Activity。

一切正常,但是,在显示新活动后,它会切换回调用的Activity并崩溃。

以下是代码段。

if(username==null)
{
    dialogs.dismiss();
    handlers.post(new MyRunable());
}

和Runnable是

public class MyRunable implements Runnable
{
    public void run(){

    Toast.makeText(ListActivity.this, "Your Connection is too slow",Toast.LENGTH_LONG).show();

    startActivity(new Intent(ListActivity.this,Anim.class));

    }
}

这是我的完整资源

    package com.cram;

    import java.io.File;
    import java.io.IOException;

    import javax.xml.parsers.ParserConfigurationException;

    import org.xml.sax.SAXException;
    import android.app.Activity;
    import android.app.AlertDialog;
    import android.app.ProgressDialog;
    import android.content.Context;
    import android.content.DialogInterface;
    import android.content.DialogInterface.OnClickListener;
    import android.content.Intent;
    import android.database.Cursor;
    import android.graphics.Typeface;
    import android.net.ConnectivityManager;
    import android.net.NetworkInfo;
    import android.os.Bundle;
    import android.os.Handler;
    import android.util.Log;
    import android.widget.ListView;
    import android.widget.TextView;
    import android.widget.Toast;

    public class BuddyListActivity extends Activity
    {

        String ss;
        private static ProgressDialog dialogs,dialog;
        private Thread downloadThreads;
        boolean results=false;
        Context ctx;
        String[]ddd;
        ListView lv1;
        String [] icons;
        BuddyDbAdapter adapter;
        NetworkInfo netinfo;
        Cursor cursor;
        String values;
        GetBuddy gb;
        BuddyDB db;
        String[] username;
        String[] firstname;
        String[] lastname;
        String[] avatar;
        String[] id;
        File[] iconss;
        Handler handlers;
        boolean ready=false;


        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.buddy);
            db=new BuddyDB(BuddyListActivity.this);
            Typeface font = Typeface.createFromAsset(getAssets(),"fonts/Fortheloveofhate.ttf");
    TextView btxt = (TextView) findViewById(R.id.textbuddy);
    btxt.setTypeface(font);
    ctx=getApplicationContext();    
    lv1=(ListView)findViewById(R.id.list22);
    netinfo=null;
    adapter=new BuddyDbAdapter(BuddyListActivity.this);
    netinfo=checkDataConnection(getApplicationContext());
    handlers = new Handler();
    adapter.open();

    if(netinfo!=null)
    {   
        downloadThreads = (Thread) getLastNonConfigurationInstance();
        if (downloadThreads != null && downloadThreads.isAlive()) {
        dialog = ProgressDialog.show(this, "Download", "downloading");
        }

        startdownload();

    }




    if(netinfo==null)
    { 

        cursor=adapter.showBuddy();         
        if (cursor==null||cursor.moveToFirst()==false) 
        {
             AlertDialog.Builder buddybox = new AlertDialog.Builder(this);
                buddybox.setMessage("You have No Buddies Yet douche!!");
    buddybox.setNeutralButton("Okay", new OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {

                        startActivity(new Intent(getBaseContext(),Anim.class));
                    }
                });
                buddybox.setCancelable(false);
             buddybox.show();
    }
        else
            {
            cursor.moveToFirst();   
            int j=0;
            ddd=new String[cursor.getCount()];
            icons=new String [cursor.getCount()];
                do
                {
            String firstName = cursor.getString(cursor.getColumnIndex(BuddyDbAdapter.BUDDY_FISTNAME));
            String lastname  = cursor.getString(cursor.getColumnIndex(BuddyDbAdapter.BUDDY_LASTNAME));
            String Avatar    = cursor.getString(cursor.getColumnIndex(BuddyDbAdapter.AVATAR));
            ddd[j]=firstName+" "+lastname;
    Log.d("Test", ddd[j]);
    icons[j]=Avatar;
    Log.d("Test", icons[j]);
    j++;
        }while(cursor.moveToNext());


        iconss= new File[icons.length];
        Log.d("Test",icons.length+"");
    for (int q = 0; q < icons.length; q++) {
        iconss[q] = new File(Download.ROOT +"/"+ icons[q]+".jpg");
    Log.d("Test", iconss[q].getAbsolutePath().toString());
    }
    //adapter.close();
                    lv1.setAdapter(new BuddyAdapter(BuddyListActivity.this,R.layout.list1,ddd,iconss));
                    onDestroy();
                }



            }
        }

    private void box() {
        // TODO Auto-generated method stub

    cursor=adapter.showBuddy(); 
    if (cursor==null||cursor.moveToFirst()==false) 
    {
        dialogs.dismiss();
         AlertDialog.Builder buddybox = new AlertDialog.Builder(this);
            buddybox.setMessage("You have No Buddies Yet ass!!");
    buddybox.setNeutralButton("Okay", new OnClickListener() {
                        public void onClick(DialogInterface dialog, int which) {

                            startActivity(new Intent(getBaseContext(),Anim.class));
                        }
                    });
                    buddybox.setCancelable(false);
                 buddybox.show();

        }

        }

        private NetworkInfo checkDataConnection(Context applicationContext) {
        final ConnectivityManager connMgr = (ConnectivityManager)BuddyListActivity.this.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo networkinfo=null;
        final android.net.NetworkInfo wifi =connMgr.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
        final android.net.NetworkInfo mobile =connMgr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
        if(wifi.isConnected()||mobile.isConnected())
        {networkinfo=connMgr.getActiveNetworkInfo();
         return networkinfo;
        }

        else
        {
            return null;
        }

    }
        @Override
        protected void onDestroy() {
            super.onDestroy();
            if (adapter != null) {
                adapter.close();
            }

        }

        @Override
        protected void onStop()
        {
            super.onStop();
            finish();

        }
        private void startdownload() {
            dialogs = ProgressDialog.show(BuddyListActivity.this, "Contacting Our Servers", "Geting Your Buddies Avatar");
        downloadThreads = new MyThread();
        downloadThreads.start();

    }

    public class MyThread extends Thread {

        @Override
        public void run() {
            try {

                new Thread();
                GetBuddy tt=new GetBuddy();
                String xml=tt.get();
                if(xml==null)
                {   dialogs.dismiss();
                    handlers.post(new MyRunable());
                    ready=false;
                    //downloadThreads.suspend();

    }
    final Download cd = new Download();
    results = cd.downloadBitmap();
    if(results)
    {
    BuddyParse bp=new BuddyParse();

    try {

        username=bp.show(xml);
    //                  if(username==null)
    //                  {   dialogs.dismiss();
    //                      handlers.post(new MyRunable());
    //                      //downloadThreads.suspend();
    //                  }
        firstname=bp.firstname();
        lastname=bp.lastname();
        avatar=bp.avatar();
        id=bp.id();
        adapter.deleteAll();
        ready=true;
    } 
    catch (ParserConfigurationException e) 
    {
        e.printStackTrace();
    }
    catch (SAXException e) 
    {
        e.printStackTrace();
    } 
    catch (IOException e) 
    {
        e.printStackTrace();
    }
    //  Log.d("len", username.length+"");

    for(int k=0; k<username.length;k++)
    { 
    adapter.insertBuddy(id[k], username[k], firstname[k], lastname[k], avatar[k]);
    Log.d("Test", id[k]+username[k]+firstname[k]+lastname[k]+avatar[k]+"");
    }
    box();
    cursor=adapter.showBuddy();
    cursor.moveToFirst();
    int i=0;
    ddd=new String[cursor.getCount()];
    icons=new String [cursor.getCount()];
        do
        {
    String firstName = cursor.getString(cursor.getColumnIndex(BuddyDbAdapter.BUDDY_FISTNAME));
    String lastname  = cursor.getString(cursor.getColumnIndex(BuddyDbAdapter.BUDDY_LASTNAME));
    String Avatar    = cursor.getString(cursor.getColumnIndex(BuddyDbAdapter.AVATAR));
    ddd[i]=firstName+" "+lastname;
    Log.d("Test", ddd[i]);
    icons[i]=Avatar;
    Log.d("Test",icons[i]);
    i++;
        }while(cursor.moveToNext());


     iconss= new File[avatar.length];
    for (int k = 0; k < avatar.length; k++) {
        iconss[k] = new File(Download.ROOT+"/"+avatar[k]+".jpg");

    Log.d("Test", iconss[k].getAbsolutePath()+"thread");
    //Log.d("Test", ddd[k]);
            }

        if (results&&ready)
            {
            dialogs.dismiss();
            handlers.post(new MyRuns());

            }
    } 
    //              else
    //              {   dialogs.dismiss();
    //                  handlers.post(new MyRunable());
    //                  
    //              }
            }finally {

            }

        }


    }

    public class MyRuns implements Runnable {
        public void run() {
            ready=true;
            lv1.setAdapter(new BuddyAdapter(ctx,R.layout.list1,ddd,iconss));
            onDestroy();
        }
    }
    public class MyRunable implements Runnable {
        public void run() {
            //Toast.makeText(BuddyListActivity.this, "Your Connection is too slow", Toast.LENGTH_LONG).show();
                startActivity(new Intent(BuddyListActivity.this,Anim.class));


            }
        }
    }

4 个答案:

答案 0 :(得分:1)

使用主线程启动线程检查runOnUiThread(Runnable action)

答案 1 :(得分:1)

RETURN块中设置try catch并进行设置 Android Manifest中的android:noHistory="true"所有活动都解决了我的问题

答案 2 :(得分:0)

如果您尝试在其他线程中创建异步任务,我建议您使用以下类:

private final class MyRunnable extends
            AsyncTask<Void, Void, Document> {
        protected Document doInBackground(Void... params) {

        }

        protected void onPostExecute(Document result) {

        }
    }

您只需要更改参数。

更多信息: http://developer.android.com/reference/android/os/AsyncTask.html

答案 3 :(得分:0)

从runnable启动另一个活动时完成当前活动。