【问题标题】:Populating a list view with retrieved HTTP URLs使用检索到的 HTTP URL 填充列表视图
【发布时间】:2018-03-31 06:45:11
【问题描述】:

我正在尝试在 android 上创建一个搜索栏,其中的 url 是从 azure blob 存储中获取的。我想在搜索查询后显示视频列表。但我做不到。

下面是错误代码

class SearchMovies extends AsyncTask<String, String, ArrayList<String>> {

String query;
String url;
String urlOne;
String itemOne;
ArrayList<String> list;
ArrayAdapter<String> adapter;
Context context;
ListView listView;
@Override
protected void onPostExecute(ArrayList<String> s) {


   Log.i("###",s.toString());

   runOnUiThread(new Runnable() {
       @Override
       public void run() {

           listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
               @Override
               public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                   Log.i("###", "BEFORE");
                   itemOne = (String) parent.getItemAtPosition(position); //null
                   Log.i("###AFTER", itemOne);
               }
           });

       }
   });

              /*  Intent intent = new Intent(MainActivity.this,Video.class);
    intent.setData(Uri.parse("https://moviestarstorage.blob.core.windows.net/action-movies/ant.mp4"));
    startActivity(intent);*/
    /*Intent intent = new Intent(context,Video.class);
    intent.setData(Uri.parse(itemOne));
    startActivity(intent);*/
    super.onPostExecute(s);
}

public SearchMovies(String passQuery, ListView passListView, Context passContext) {
    this.query = passQuery;
    this.context = passContext;
    this.listView = passListView;



}

 @Override
 protected ArrayList<String> doInBackground(String... params) {


    try {

        HttpHandler httpHandler = new HttpHandler();
        Log.i("###URLFromAPI", "Entered");
        url = "http://13.71.112.116/?keyword=" + query; // This is the API call
        String jsonstr = httpHandler.makeServiceCall(url); //
        Log.i("###URLFromAPI", "Entered");
        JSONObject jsonObject = new JSONObject(jsonstr);
        urlOne = jsonObject.getString("urls"); // urls are being fetched and logged on the screen

        String[] urlArray = urlOne.split(","); //seperating the url
        list = new ArrayList<String>();

        for(int i=0;i<3;i++)
        {
            list.add(i,urlArray[i]);
            Log.i("###FROMLOOP",list.get(i));
        }

        adapter = new ArrayAdapter<String>(MainActivity.this,android.R.layout.simple_expandable_list_item_1,list);
        listview.setAdapter(adapter);
        /*runOnUiThread(new Runnable() {
            //String item;
            @Override
            public void run() {

                adapter = new ArrayAdapter<String>(MainActivity.this,android.R.layout.simple_expandable_list_item_1,list);
                Log.i("###","hello");
                listview.setAdapter(adapter);
                Log.i("###","hello");
                listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                    @Override
                    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                        Log.i("###","BEFORE");
                       itemOne = (String) parent.getItemAtPosition(position);
                        Log.i("###AFTER", itemOne);
                    }
                });


            }
        });*/


       /* Log.i("###",urlOne);
        if (urlOne == "") {
            Log.i("###", "URL is null");
        }
        else
            Log.i("###URLFromAPI", urlOne.toString());*/
    }
    catch (Exception e){
        e.printStackTrace();
    }

    return list;
}

}

以下是错误。

com.base.vrushali.collapsingtoolbar W/System.err: android.view.ViewRootImpl$CalledFromWrongThreadException: 只有创建视图层次结构的原始线程才能接触其视图。 03-31 11:50:37.005 26602-27033/com.base.vrushali.collapsingtoolbar W/System.err: 在 android.view.ViewRootImpl.checkThread(ViewRootImpl.java:7988) 03-31 11:50:37.005 26602-27033/com.base.vrushali.collapsingtoolbar W/System.err: 在 android.view.ViewRootImpl.invalidateChildInParent(ViewRootImpl.java:1392) 03-31 11:50:37.005 26602-27033/com.base.vrushali.collapsingtoolbar W/System.err: 在 android.view.ViewGroup.invalidateChild(ViewGroup.java:5426) 03-31 11:50:37.005 26602-27033/com.base.vrushali.collapsingtoolbar W/System.err: 在 android.view.View.invalidateInternal(View.java:14959) 03-31 11:50:37.006 26602-27033/com.base.vrushali.collapsingtoolbar W/System.err: 在 android.view.View.invalidate(View.java:14923) 03-31 11:50:37.006 26602-27033/com.base.vrushali.collapsingtoolbar W/System.err: 在 android.view.View.invalidate(View.java:14907) 03-31 11:50:37.006 26602-27033/com.base.vrushali.collapsingtoolbar W/System.err: 在 android.widget.AbsListView.resetList(AbsListView.java:2791) 03-31 11:50:37.006 26602-27033/com.base.vrushali.collapsingtoolbar W/System.err: 在 android.widget.ListView.resetList(ListView.java:592) 03-31 11:50:37.006 26602-27033/com.base.vrushali.collapsingtoolbar W/System.err: 在 android.widget.ListView.setAdapter(ListView.java:533) 03-31 11:50:37.006 26602-27033/com.base.vrushali.collapsingtoolbar W/System.err: 在 com.base.vrushali.collapsingtoolbar.MainActivity$SearchMovies.doInBackground(MainActivity.java:356) 03-31 11:50:37.007 26602-27033/com.base.vrushali.collapsingtoolbar W/System.err: 在 com.base.vrushali.collapsingtoolbar.MainActivity$SearchMovies.doInBackground(MainActivity.java:282) 03-31 11:50:37.007 26602-27033/com.base.vrushali.collapsingtoolbar W/System.err: 在 android.os.AsyncTask$2.call(AsyncTask.java:305) 03-31 11:50:37.007 26602-27033/com.base.vrushali.collapsingtoolbar W/System.err: at java.util.concurrent.FutureTask.run(FutureTask.java:237) 03-31 11:50:37.007 26602-27033/com.base.vrushali.collapsingtoolbar W/System.err: 在 android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:243) 03-31 11:50:37.007 26602-27033/com.base.vrushali.collapsingtoolbar W/System.err: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133) 03-31 11:50:37.007 26602-27033/com.base.vrushali.collapsingtoolbar W/System.err: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607) 03-31 11:50:37.007 26602-27033/com.base.vrushali.collapsingtoolbar W/System.err: at java.lang.Thread.run(Thread.java:762) 03-31 11:51:36.672 26602-26602/com.base.vrushali.collapsingtoolbar W/IInputConnectionWrapper:非活动 InputConnection 上的 finishComposingText 03-31 11:51:36.795 26602-26602/com.base.vrushali.collapsingtoolbar W/IInputConnectionWrapper:非活动 InputConnection 上的 getCursorCapsMode 03-31 11:51:36.865 26602-26602/com.base.vrushali.collapsingtoolbar W/IInputConnectionWrapper:非活动 InputConnection 上的 getCursorCapsMode 03-31 11:51:36.958 26602-26602/com.base.vrushali.collapsingtoolbar W/IInputConnectionWrapper:非活动 InputConnection 上的 getSelectedText 03-31 11:51:36.959 26602-26602/com.base.vrushali.collapsingtoolbar W/IInputConnectionWrapper:getTextBeforeCursor on inactive InputConnection 03-31 11:51:36.960 26602-26602/com.base.vrushali.collapsingtoolbar W/IInputConnectionWrapper:非活动 InputConnection 上的 getTextAfterCursor 03-31 11:52:04.413 1678-8196/? W/ActivityManager:ActivityRecord 的重复完成请求{947dd63d0 u0 com.base.vrushali.collapsingtoolbar/.MainActivity t22054 f}

【问题讨论】:

    标签: java android http httpconnection


    【解决方案1】:

    runOnUiThreadonPostExecute 中不需要,只有在您从doInBackground 更新View 时才需要

    protected void onPostExecute(ArrayList<String> s) {
        super.onPostExecute(s);
    
           Log.i("###",s.toString());
                   listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                       @Override
                       public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                           Log.i("###", "BEFORE");
                           itemOne = (String) parent.getItemAtPosition(position); //null
                           Log.i("###AFTER", itemOne);
                       }
                   });
    
    
        }
    

    如果您正在更新doInBackground 中的视图

    @Override
     protected ArrayList<String> doInBackground(String... params) {
    
    
        try {
    
            HttpHandler httpHandler = new HttpHandler();
            Log.i("###URLFromAPI", "Entered");
            url = "http://13.71.112.116/?keyword=" + query; // This is the API call
            String jsonstr = httpHandler.makeServiceCall(url); //
            Log.i("###URLFromAPI", "Entered");
            JSONObject jsonObject = new JSONObject(jsonstr);
            urlOne = jsonObject.getString("urls"); // urls are being fetched and logged on the screen
    
            String[] urlArray = urlOne.split(","); //seperating the url
            list = new ArrayList<String>();
    
            for(int i=0;i<3;i++)
            {
                list.add(i,urlArray[i]);
                Log.i("###FROMLOOP",list.get(i));
            }
    
          runOnUiThread(new Runnable() {
                //String item;
                @Override
                public void run() {
    
                    adapter = new ArrayAdapter<String>(MainActivity.this,android.R.layout.simple_expandable_list_item_1,list);
                    Log.i("###","hello");
                    listview.setAdapter(adapter);
                    Log.i("###","hello");
                               });
    
    
           /* Log.i("###",urlOne);
            if (urlOne == "") {
                Log.i("###", "URL is null");
            }
            else
                Log.i("###URLFromAPI", urlOne.toString());*/
        }
        catch (Exception e){
            e.printStackTrace();
        }
    
        return list;
    }
    

    【讨论】:

    • 之前甚至现在都试过了。单击搜索选项时,我们可以在日志中查看 url,但它没有显示下面的视频。
    • @DhvaniShah 能否详细解释一下,应用此解决方案后是否仍然显示相同的错误日志,我认为您在谈论其他问题
    • 没有错误日志,但也没有上传视频
    • 我已经更新了代码,您尝试在后台设置适配器并抛出异常,因为您将其保留在 try catch 应用程序没有崩溃,只需检查 catch 块是否使用 `e 执行.printStackTrace();`
    • 我们已经接近这个了,但现在 url 正在列表视图中显示。我想要的是在单击 listView 上的每个项目时调用一些活动
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-05
    • 1970-01-01
    • 1970-01-01
    • 2015-08-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多