2016-05-22 11 views
-1

私はJavaのクラスに1つのアクティビティを、もう1つにはボイドを実行したいクラスがあります。 Web.javaは、次のようになります。これを実行するための最良の方法は何ですか?非同期

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

そして、これはほとんどのメインスレッドの上に正常に動作しますが、私はそれは違うオーバー行くようにしたいですスレッドのように私のUI doesntは、接続が悪い場合に詰まる 私はどのように非同期でこの作品を作るだろうか?これは初めての私は非同期を使用していますが、私はそれを使うべき方法を理解していません。数日間過ごしてみると、絶対に成功しないと思っています。 私は、私の現在のコードと比較し、それが最初

を実現することができますどのような私は間違っ

+0

まず、AsyncTaskを作成しようとしませんでしたか?もしそうなら、[編集]して試してみてください。より簡単な方法でネットワークリクエストを作成したい場合は、VolleyまたはOkHttpを使用してください。 –

+0

私の答えを確認すると、本当に役立ちます。 -waiting-for-answer/37292163?noredirect = 1#comment62112709_37292163 –

答えて

0

を私はcallbackパターンAsynchronous networkingための最善の選択肢と同じようsitutionを扱うか、AsyncTaskを使用することができますが、イムはcllbackパターンを説明学ぶことができましたcallbackインターフェイス

public interface Request { 

    void onSuccess(Document doc); 

} 

2 - 実装はRunnable

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別のスレッドでAsynchronous要求を実行するために - 今、私たちはその前new Thread(Runnable)を使用し、ここでExecutorService(ここでは理由のために作成さThreadPools ...そのオフトピック)、単純なことで作業しますあなたがnew結果を必要とするか、またはあなたがスレッドを作成する必要があり、あなたたい場合は、要求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; 
    } 
} 

、すべてをすることができますクラスやスレッド間の結果を共有するこれは別のものです

このパターンは完全に私を動作させます。

+0

また、コールバックをAsyncTaskで使用することもできます。スレッドプールを使用すると、より多くの作業が必要になると思われます –

+0

@ cricket_007 'AsyncTask'には' parallelism'で 'lotsissues'がたくさんあり、ジョブを' finish'してリクエストを 'manage'します – Hosseini

+0

しかし質問は、示されているコードは非同期で、Webリクエストだけなので、答えが解決策を提供するかもしれませんが、必要以上に複雑です。これはすべて –

関連する問題