2016-04-10 19 views
0

Ich habe alles den ganzen Tag versucht. Ich möchte, dass verschiedene Schaltflächen funktionieren, wenn ich auf sie klicke. Das habe ich mit AsyncTasks gemacht.AsyncTask zeigt keine URI

MainActivity.java

package com.mudd.devin.drive_now; 

import android.support.v7.app.ActionBarActivity; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.Button; 

import java.net.URI; 

public class MainActivity extends ActionBarActivity { 

    @Override 
    protected void onCreate(Bundle icicle) { 
     super.onCreate(icicle); 

     setContentView(R.layout.activity_main); 

     final Button button = (Button) findViewById(R.id.button); 
     button.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       // Perform action on click 
       new Action().execute(); 
      } 
     }); 
    } 
} 

Action.java

package com.mudd.devin.drive_now; 

import android.content.Intent; 
import android.net.Uri; 
import android.os.AsyncTask; 

import java.net.URI; 
import java.util.Locale; 

/** 
* Created by Devin on 4/9/2016. 
*/ 
public class Action extends AsyncTask<URI, URI, Intent> { 




    @Override 
    protected Intent doInBackground(URI... params) { 
     String uri = String.format(Locale.ENGLISH, "http://maps.google.com/maps"); 
     Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(uri)); 
     intent.setClassName("com.google.android.apps.maps", "com.google.android.maps.MapsActivity"); 
     return intent; 
    } 


} 

Vielen Dank im Voraus. Heute habe ich gemerkt, dass ich ein wirklich beschissener Entwickler bin und Apps sind wirklich schwer zu machen.

+0

Machst du eigentlich irgendwas in 'onPostExecute (Intent result)' - hast du diese Methode in deiner 'Action'' AsyncTask' überschrieben, um etwas mit der Absicht zu tun? Siehe auch: https://developers.google.com/maps/documentation/android-api/intents#overview P.S. Sei nicht zu hart zu dir selbst! –

+0

Ich habe nichts in OnPostExecute getan. Ich habe nur doInBackground berührt. Ich weiß, dass der Google Maps-Code funktioniert, weil ich ihn zuvor verwendet habe. – deeup511

+0

Nun, Sie müssen diese Methode überschreiben, um etwas mit der Absicht zu tun. Wenn Sie Android Studio verwenden, stellen Sie sicher, dass sich der Cursor irgendwo in Ihrer Action-Klasse befindet, gehen Sie zum "Code" -Menü, wählen Sie "Methoden überschreiben" und wählen Sie "onPostExecute()" - dies zeigt die neue Methode an. overadden "Jetzt können Sie alles mit dem Ergebnisobjekt (intent) wie' startActivity (intent) tun. Um ehrlich zu sein, für das, was Sie tun, brauchen Sie für diesen Vorgang keine AsyncTask. –

Antwort

0

Erstens, ich verstehe nicht, warum Sie eine asynctask nur einen anderen Prozess mit einer Absicht starten möchten. AyncTask ist nützlich für intensive Prozesse wie Netzwerkoperationen oder Dateilesen, aber es für die Erstellung von Absicht zu verwenden, ist echte Verschwendung!

Und ich kann nicht sehen, dass Sie irgendwelche URI-Parameter an die AsyncTask übergeben.!

So können Sie die Absicht direkt von onclick aufrufen (was ich empfehlen würde). Oder sollte man die Aktivität von irgendwo wie diese beginnen:

Methode 1


public class Action extends AsyncTask<URI, Void, Intent> { 
    private final Context context; 
    public Action(Context context){ 
     this.context = context; 
    } 

    @Override 
    protected Intent doInBackground(URI... params) { 
     String uri = String.format(Locale.ENGLISH, "http://maps.google.com/maps"); 
     Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(uri)); 
     intent.setClassName("com.google.android.apps.maps", "com.google.android.maps.MapsActivity"); 
     return intent; 
    } 

    @Override 
    protected void onPostExecute(Intent intent){ 
     context.startActivity(intent); 
    } 
} 

Und nennen Sie es wie dieser

new Action(context).execute(); 

Methode 2:


public class Action extends AsyncTask<Void, Void,Void>{ private final Context context; 
    public Action(Context context){ 
     this.context = context; 
    } 

    @Override 
    protected Intent doInBackground(Void params) { 
     String uri = String.format(Locale.ENGLISH, "http://maps.google.com/maps"); 
     Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(uri)); 
     intent.setClassName("com.google.android.apps.maps", "com.google.android.maps.MapsActivity"); 
     context.startActivity(intent) 


    return null; 
} 
} 

Methode empfohlen

button.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       // Perform action on click 
      Uri uri = Uri.parse("http://maps.google.com/maps"); 
      Intent intent = new Intent(Intent.ACTION_VIEW, uri); 
      intent.setClassName("com.google.android.apps.maps", "com.google.android.maps.MapsActivity"); 
      startActivity(intent) 
      } 
     }); 

Und ich Sie Aktion als einen Klassennamen nicht empfehlen die Verwendung!

+0

Genau so habe ich es früher gemacht. Ich danke dir sehr. – deeup511

+0

@ deeup511if das half, bitte meine Antwort akzeptieren –

0

Sie müssen onPostExecute zu Ihrem AsyncTask hinzufügen. Wenn Sie dies nicht tun, wird Ihr Ergebnis (die Absicht) einfach verworfen.

z.