2016-05-22 17 views
-1

Ich habe Java-Klassen, eine der Aktivität und die andere ist die Klasse, die ich eine void ausführen möchte. Web.java wie folgt aussieht:Was wäre der beste Weg, dies zu tun Async

import org.jsoup.Jsoup; 
import org.jsoup.nodes.Document; 

import java.io.BufferedReader; 
import java.io.InputStreamReader; 
import java.net.HttpURLConnection; 
import java.net.URL; 

public class Web { 
    public Document requestPage(String urll) throws Exception { 
     StringBuilder result = new StringBuilder(); 
     URL url = new URL(urll); 
     HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
     conn.setRequestMethod("GET"); 
     BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream())); 
     String line; 
     while ((line = rd.readLine()) != null) { 
      result.append(line); 
     } 
     rd.close(); 
     Document doc = Jsoup.parse(result.toString()); 
     return doc; 
    } 
} 

Und mein MainActivity.java sieht wie folgt aus:

import android.support.v7.app.AppCompatActivity; 
import android.widget.Button; 
import android.widget.EditText; 
import android.view.View; 
import android.widget.Toast; 

import org.jsoup.Jsoup; 
import org.jsoup.nodes.Document; 


public class MainActivity extends AppCompatActivity { 

    Button Visit; 
    EditText Urlbox; 
    Web web = new Web(); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); 
     StrictMode.setThreadPolicy(policy); 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     Visit = (Button)findViewById(R.id.Button); 
     Urlbox = (EditText)findViewById(R.id.EditText); 
     Visit.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Document lol = web.requestPage(Urlbox.getText().toString()); 
       if(lol.text().toString() != null){ 
        Toast.makeText(MainActivity.this, "Visit success!",Toast.LENGTH_SHORT).show(); 
       } 
      } 
     }); 
    } 
} 

Und das funktioniert gut über den Haupt-Thread die meisten, aber ich möchte es eine andere übergehen machen thread so meine Benutzeroberfläche nicht gestaut, wenn die Verbindung schlecht ist Wie würde ich dies in async arbeiten? Dies ist mein erstes Mal, dass ich async benutze, aber ich verstehe nicht, wie ich es verwenden sollte, ich habe ein paar Tage damit verbracht, es mit absolut keinem Erfolg herauszufinden Wenn ich also ein paar Beispiele bekommen könnte, die funktionieren, wäre das fantastisch, also ich vergleichen könnte es zu meinem aktuellen Code und lernen, was ich falsch gemacht haben

+0

Sie haben nicht zuerst versucht, eine AsyncTask zu erstellen? Wenn ja, bitte [bearbeiten] und zeigen Sie Ihren Versuch. Wenn Sie eine einfachere Möglichkeit wünschen, eine Netzwerkanfrage zu stellen, dann verwenden Sie Volley oder OkHttp –

+0

Sie überprüfen meine Antwort wird es wirklich hilfreich tannen Sie http://stackoverflow.com/questions/37289109/calling-a-async-task-and -waiting-for-answer/37292163? noredirect = 1 # comment62112709_37292163 –

Antwort

0

i sitution wie mit callback Muster seine beste Option Griff für Asynchronous networking oder Sie können AsyncTask verwenden, aber im erklären cllback Muster lässt es

zuerst so geschehen create callback Schnittstelle

public interface Request { 

    void onSuccess(Document doc); 

} 

2 - Geräte Runnable für

public class Web implements Runnable { 

    public final Request request; 
    private final String urll;  

    Web(String urll, Request request){ 
     this.urll = urll; 
     this.request = request; 
    } 


    @Override public void run() { 
     try{ 
     StringBuilder result = new StringBuilder(); 
     URL url = new URL(urll); 
     HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
     conn.setRequestMethod("GET"); 
     BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream())); 
     String line; 
     while ((line = rd.readLine()) != null) { 
      result.append(line); 
     } 
     rd.close(); 
     Document doc = Jsoup.parse(result.toString()); 
     // fill the cllback with result 
     this.request.onSuccess(doc); 
     } 
     } catch (InterruptedException e) { 
      Thread.currentThread().interrupt(); 
     } 

//   return doc; 
    } 
} 

3 auf einem anderen Thread Asynchronous Anfrage läuft - jetzt arbeiten wir mit ExecutorService (ThreadPools für Grund erstellt .. sein vom Thema hier), einfache Sache hier benutzen wir new Thread(Runnable) vor, dass lässt implement die calback

public class MainActivity extends AppCompatActivity implement Request{ 

    Button Visit; 
    EditText Urlbox; 
    private Document lol; 
    //Web web = new Web(); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); 
     StrictMode.setThreadPolicy(policy); 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     Visit = (Button)findViewById(R.id.Button); 
     Urlbox = (EditText)findViewById(R.id.EditText); 
     Visit.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       //Document lol = web.requestPage(Urlbox.getText().toString()); 
       String url = Urlbox.getText().toString(); 
       Thread thread = new Thread(new Web(url, this)); 
       thread.start(); 
       if(lol.text().toString() != null){ 
        Toast.makeText(MainActivity.this, "Visit success!",Toast.LENGTH_SHORT).show(); 
       } 
       thread.interrupt(); 
      } 
     }); 
    } 


    @Override 
    public void onSuccess(Document doc) { 
     lol = doc; 
    } 
} 

und jeder, wo Sie new Ergebnis benötigen oder fordern Sie Thread erstellen haben und wenn Sie wollen, teilen Ergebnis betwwwen Klassen oder Thread das ist eine andere Sache

dieses Muster funktioniert perfekt mich.

+0

Sie können auch Callbacks in einer AsyncTask verwenden. Die Verwendung des Thread-Pools scheint mehr Arbeit als erforderlich zu sein –

+0

@ cricket_007 'AsyncTask' haben viele' Fragen 'mit 'Parallelität' und' beende' den Job und 'verwalten' die Anfrage – Hosseini

+0

Aber die Frage nur, wie man das macht Der Code wird asynchron angezeigt, und es handelt sich nur um eine Webanfrage. Ihre Antwort liefert zwar eine Lösung, ist jedoch komplexer als erforderlich. Das ist alles –

Verwandte Themen