2016-05-22 3 views
-1

У меня есть классы Java, один из которых является активным, а другой - классом, из которого я хочу запустить void. Web.java выглядит следующим образом:Что было бы лучшим способом сделать этот запуск 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; 
    } 
} 

И мой MainActivity.java выглядит следующим образом:

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(); 
       } 
      } 
     }); 
    } 
} 

И это отлично работает над основной нитью большинства, но я хочу, чтобы сделать его более другой нить, поэтому мой пользовательский интерфейс не застрял, если соединение плохое. Как бы сделать эту работу в async? Это мой первый раз, когда я использую async, но я просто не понимаю, как я должен его использовать, ive потратил несколько дней, пытаясь понять это с абсолютным успехом. Так что, если бы я мог получить несколько примеров, которые бы работали, это было бы фантастично, поэтому я мог бы сравнить его с моим текущим кодом и узнать, что я сделал неправильно

+0

Вы сначала не пытались сделать AsyncTask? Если это так, пожалуйста, [править] и показать свою попытку. Если вам нужен более простой способ сделать сетевой запрос, то используйте Volley или OkHttp –

+0

. Вы, ван, проверяете мой ответ, это будет очень полезно для вас. Http://stackoverflow.com/questions/37289109/calling-a-async-task-and Ожидание-для-ответа/37292163? noredirect = 1 # comment62112709_37292163 –

ответ

0

я обрабатывать sitution как с callback Pattern его лучшим вариантом для Asynchronous networking или вы можете использовать AsyncTask, но им объяснить cllback модели так позволяет сделать это произойдет

первого создание callback интерфейс

public interface Request { 

    void onSuccess(Document doc); 

} 

2 - реализует Runnable для запуска Asynchronous запроса в другом потоке

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 - теперь мы работаем с ExecutorService (ThreadPools создана причиной .. его не по теме здесь), простая вещь, здесь мы используем new Thread(Runnable) до того, что позволяет implementcalback в

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; 
    } 
} 

и каждый, где вам нужно new результат или запрос, вы должны создать поток, и если вы хотите доля результатов в классах или нити это другое дело

этот образец работает отлично.

+0

Вы также можете использовать обратные вызовы в AsyncTask. Использование пула потоков выглядит как больше работы, чем требуется –

+0

@ cricket_007 'AsyncTask' имеет множество' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' запрос '' – Hosseini

+0

Но вопрос только спросил, как сделать показанный код асинхронный, и это всего лишь веб-запрос, поэтому, хотя ваш ответ может предоставить решение, он более сложный, чем необходимо. Это все –

Смежные вопросы