2017-12-18 159 views
-3
//[(START)File:ThirdActivity.java] --> 
package com.example.caleb.splash_screen; 

import android.os.AsyncTask; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.util.Log; 
import android.widget.TextView; 
import java.io.*; 
import java.net.HttpURLConnection; 
import java.net.MalformedURLException; 
import java.net.URL; 
import java.io.IOException; 
import java.io.OutputStream; 


public class ThirdActivity extends AppCompatActivity { 
    //public String text = "https://jsonparsingdemo-cec5b.firebaseapp.com/jsonData/moviesDemoItem.txt"; 


    public TextView text; 

    private void writeStream(OutputStream out){ 
     String output = "Hello world"; 

     // out.write(output.getBytes()); 
     //out.flush(); 
    } 


    /*private String readStream(InputStream is) { 
     try {`enter code here` 
      ByteArrayOutputStream bo = new ByteArrayOutputStream(); 
      int i = is.read(); 
      while(i != -1) { 
       bo.write(i); 
       i = is.read(); 
      } 
      return bo.toString(); 
     } catch (IOException e) { 
      return ""; 
     } 
    }*/ 

    //[(START) readStream --> 
    private String readStream(InputStream in) throws IOException { 
    BufferedReader bin = new BufferedReader(new InputStreamReader(in)); 
    //temporary 
     try { 
      StringBuilder sb = new StringBuilder(); 
      String inputLine; 
      while ((inputLine = bin.readLine()) != null) { 
       sb.append(inputLine); 
      } 
      return sb.toString(); 


     } finally { 

     } 
    } 
    //[(END) readStream --> 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_third2); 

     text = (TextView)findViewById(R.id.textView); 

     new JSONTask().execute("https://jsonparsingdemo-cec5b.firebaseapp.com/jsonData/moviesDemoItem.txt"); 

    } 

} 
//[(END)File:ThirdActivity] --> 







//[(START)File:JSONTask] --> 

package com.example.caleb.splash_screen; 

import android.app.Activity; 
import android.content.Context; 
import android.os.AsyncTask; 
import android.support.v4.widget.TextViewCompat; 
import android.support.v7.app.AppCompatActivity; 
import android.util.Log; 
import android.widget.TextView; 

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.net.HttpURLConnection; 
import java.net.MalformedURLException; 
import java.net.URL; 

/** 
* Created by Caleb on 12/17/2017. 
*/ 

public class JSONTask extends AsyncTask<String,String,String> { 


//final TextView txt = (TextView)findViewById(R.id.textView); 
    private Context context; 

    public JSONTask(Activity ThirdActivity) { 
     context = ThirdActivity; 
    } 

@Override 
    protected String doInBackground(String... params) { 
     BufferedReader reader = null; 
     HttpURLConnection urlConnection = null; 
     //{(START)] Working Connection:ALERT! Error within code will cause crash --> 
     try { 
      URL url = new URL(params[0]); 
      Log.w("testing", "test"); 
      urlConnection = (HttpURLConnection) url.openConnection(); 
      urlConnection.setRequestMethod("GET"); 
      urlConnection.setDoOutput(false); 
      urlConnection.connect(); 
      //urlConnection.setChunkedStreamingMode(0); 
      //OutputStream out = new BufferedOutputStream(urlConnection.getOutputStream()); 
      //writeStream(out); 
      /*int a = urlConnection.getResponseCode(); 
      String b = String.valueOf(a); 
      Log.e(b, "yesssssssssssssssss");*/ 

      InputStream in = urlConnection.getInputStream(); 
      //InputStream in = new BufferedInputStream(urlConnection.getInputStream()); 
      reader = new BufferedReader(new InputStreamReader(in)); 
      StringBuffer buffer = new StringBuffer(); 
      String line = ""; 
      while ((line = reader.readLine()) != null) { 
       buffer.append(line); 
      } 
      /*String data = readStream(in); 
      /*final TextView textView = (TextView) findViewById(R.id.textView); 
      textView.setText("hello"); 
      */ 

      return buffer.toString(); 

     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      throw new RuntimeException(e); 

     } finally { 
      if (urlConnection != null) { 
       urlConnection.disconnect(); 
      } 
      try { 
       if (reader != null) { 
        reader.close(); 
       } 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 

     //{(END)] Working Connection --> 
     return null; 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     super.onPostExecute(result); 
     TextView text = (TextView) ((AppCompatActivity) context).findViewById(R.id.textView); 
     text.setText(result); 

    } 

} 
//[(END)File:JSONTask] --> 

/預期的效果/我想從JSON數據,我從HttpURLConnection的得到實現的TextView

塊引用

我想從JSON中提取數據文件指出url指向並更改UI中稱爲textView的TextView。我不明白如何訪問AsyncTask中的findviewbyid。我看了所有整個互聯網,但沒有找到任何東西:(任何建議都非常感謝!

回答

0

嘗試弱引用獲得的TextView中的AsyncTask

//調用異步任務

new JSONTask(yourTextView).execute(); 

//你的異步任務

private final WeakReference<TextView> textViewReference; 

    public JSONTask (TextView textView){ 
     textViewReference = new WeakReference<TextView>(textView); 
    } 


    @Override 
    protected void onPostExecute() { 


      TextView textView = textViewReference.get(); 
      //set values to text view 

    } 
0

我使用OkHttp做同樣的任務,我的應用程序

  • HTTP/2支持允許對同一主機的所有請求共享一個套接字。

  • 連接池減少了請求延遲(如果HTTP/2不可用)。

  • 透明GZIP縮小下載大小。

  • 響應緩存避免網絡完全重複請求。

添加這種依賴性

implementation 'com.squareup.okhttp3:okhttp:3.9.1' 

然後創建/代碼名爲新類OkHttpHandler

class OkHttpHandler extends AsyncTask<String, String, String> { 

     OkHttpClient client = new OkHttpClient(); 
     private volatile String data; 

     public String getResult() { 
      return data; 
     } 

     @Override 
     protected String doInBackground(String... params) { 

      try { 
       Request.Builder builder = new Request.Builder(); 
       builder.url(params[0]); 
       Request request = builder.build(); 

       Response response = client.newCall(request).execute(); 
       return response.body().string(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
      return null; 
     } 

     @Override 
     protected void onPostExecute(String s) { 
      super.onPostExecute(s); 
      data = s; 
     } 
    } 
} 

,並使用它像這樣

String str = new OkHttpHandler().execute("http://www.<TEST>.com/json").get(); 

我也建議檢查Wi-fi-Connected/Bluetooth-ConnectedPhoneData-Enabled是否if真正 /否則,繼續你的代碼